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?


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();

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.


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;
    }
 }

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();


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
   }
}

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();

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')

$ 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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.