Eine Funktion innerhalb einer Class-Methode aufrufen?

106

Ich habe versucht herauszufinden, wie ich das machen soll, bin mir aber nicht ganz sicher, wie.

Hier ist ein Beispiel dafür, was ich versuche zu tun:

class test {
     public newTest(){
          function bigTest(){
               //Big Test Here
          }
          function smallTest(){
               //Small Test Here
          }
     }
     public scoreTest(){
          //Scoring code here;
     }
}

Hier ist der Teil, mit dem ich Probleme habe. Wie rufe ich bigTest () auf?

WAC0020
quelle
2
Nur um sicherzugehen: Eine Funktion und eine Methode sind genau die gleiche Funktion === Methode. Der Begriff Methode wird in der OO-Sprache häufiger verwendet, um die Funktion einer Klasse zu beschreiben.
Markus
Der Grund, warum einige der Begriffe fehlen, ist, dass ich auf dem Weg aus dem Büro war und daher wenig Zeit hatte.
WAC0020

Antworten:

199

Probier diese:

class test {
     public function newTest(){
          $this->bigTest();
          $this->smallTest();
     }

     private function bigTest(){
          //Big Test Here
     }

     private function smallTest(){
          //Small Test Here
     }

     public function scoreTest(){
          //Scoring code here;
     }
}

$testObject = new test();

$testObject->newTest();

$testObject->scoreTest();
Sergey Kuznetsov
quelle
1
Ist es möglich, eine function()von einer anderen .php-Seite innerhalb einer Klassenfunktion auszuführen und dann Ergebnisse innerhalb der Klassenfunktion abzurufen? Beispiel: Ich habe eine Abfrage, die alle aus einer Tabelle auswählt und dann eine Ergebnismenge zum Abrufen aller zurückgibt. Ist es möglich, diese Ergebnismenge innerhalb einer Klassenfunktion zu durchlaufen? zBclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111
22

Das von Ihnen bereitgestellte Beispiel ist kein gültiges PHP und weist einige Probleme auf:

public scoreTest() {
    ...
}

ist keine ordnungsgemäße Funktionsdeklaration - Sie müssen Funktionen mit dem Schlüsselwort 'function' deklarieren.

Die Syntax sollte eher lauten:

public function scoreTest() {
    ...
}

Zweitens macht das Umschließen der Funktionen bigTest () und smallTest () in public function () {} sie nicht privat - Sie sollten das private Schlüsselwort für beide einzeln verwenden:

class test () {
    public function newTest(){
        $this->bigTest();
        $this->smallTest();
    }

    private function bigTest(){
        //Big Test Here
    }

    private function smallTest(){
           //Small Test Here
    }

    public function scoreTest(){
      //Scoring code here;
    }
}

Es ist auch üblich, Klassennamen in Klassendeklarationen groß zu schreiben ('Test').

Hoffentlich hilft das.

pjbeardsley
quelle
11
class test {
    public newTest(){
        $this->bigTest();
        $this->smallTest();
    }

    private  function bigTest(){
        //Big Test Here
    }

    private function smallTest(){
       //Small Test Here
    }

    public scoreTest(){
      //Scoring code here;
    }
 }
Meganathan S.
quelle
10

Ich denke, Sie suchen nach so etwas.

class test {

    private $str = NULL;

    public function newTest(){

        $this->str .= 'function "newTest" called, ';
        return $this;
    }
    public function bigTest(){

        return $this->str . ' function "bigTest" called,';
    }
    public function smallTest(){

        return $this->str . ' function "smallTest" called,';
    }
    public function scoreTest(){

        return $this->str . ' function "scoreTest" called,';
    }
}

$test = new test;

echo $test->newTest()->bigTest();
Ali Hasan
quelle
3

Sie müssen aufrufen newTest, um die in dieser Methode deklarierten Funktionen "sichtbar" zu machen (siehe Funktionen innerhalb von Funktionen ). Aber das sind dann nur normale Funktionen und keine Methoden.

Gumbo
quelle
3

Um eine "Funktion innerhalb einer Funktion" zu haben, benötigen Sie, wenn ich verstehe, was Sie fragen, PHP 5.3, wo Sie die neue Closure-Funktion nutzen können.

Sie könnten also haben:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}
Dummkopf
quelle
3

Um eine Methode eines Objekts aufzurufen, das aus einer Klasse instanziiert wurde (mit der Anweisung new), müssen Sie darauf "zeigen". Von außen verwenden Sie einfach die Ressource, die durch die neue Anweisung erstellt wurde. In jedem von new erstellten Objekt speichert PHP dieselbe Ressource in der Variablen $ this. Innerhalb einer Klasse MÜSSEN Sie also mit $ this auf die Methode verweisen. Um in Ihrer Klasse smallTestinnerhalb der Klasse aufzurufen , müssen Sie PHP mitteilen, welches der Objekte, die mit der neuen Anweisung erstellt wurden, die Sie ausführen möchten, einfach schreiben:

$this->smallTest();
Ingeniero
quelle
Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext befinden
Stnfordly,
2

Beispiel 1

class TestClass{
public function __call($name,$arg){
call_user_func($name,$arg);
}
}
class test {
     public function newTest(){

          function bigTest(){
               echo 'Big Test Here';
          }
          function smallTest(){
               echo 'Small Test Here';
          }

$obj=new TestClass;

return $obj;
     }

}
$rentry=new test;
$rentry->newTest()->bigTest();

Beispiel2

class test {
     public function newTest($method_name){

          function bigTest(){
               echo 'Big Test Here';
          }
          function smallTest(){
               echo 'Small Test Here';
          }

      if(function_exists( $method_name)){    
call_user_func($method_name);
      }
      else{
          echo 'method not exists';
      }
     }

}
$obj=new test;
$obj->newTest('bigTest')
zloctb
quelle
$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- Schwerwiegender Fehler: BigTest () kann nicht erneut deklariert werden (zuvor deklariert.
tfont
2

Sie können auch self::CONSTanstelle von verwenden, $this->CONSTwenn Sie eine statische Variable oder Funktion der aktuellen Klasse aufrufen möchten.

AlexioVay
quelle
2
  class sampleClass
    { 
        public function f1()
        {
           return "f1 run";
        }

        public function f2()
        {
           echo ("f2 run" );
           $result =  $this->f1();
           echo ($result);
        }   

    f2();  

    }

Ausgabe :

f2 run f1 run

Masoud Siahkali
quelle