Chiamare una funzione all'interno di un metodo Class?


108

Ho cercato di capire come procedere, ma non sono abbastanza sicuro di come.

Ecco un esempio di quello che sto cercando di fare:

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

Ecco la parte con cui ho problemi, come posso chiamare bigTest ()?


2
Giusto per essere sicuri: una funzione e un metodo sono esattamente la stessa funzione === metodo. Il termine metodo è più spesso utilizzato nel linguaggio OO per descrivere la funzione di una classe.
markus

Il motivo per cui mancano alcuni termini è che stavo uscendo dall'ufficio, quindi avevo poco tempo.
WAC0020

Risposte:


201

Prova questo:

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
È possibile eseguire un function()da un'altra pagina .php all'interno di una funzione di classe e quindi prendere i risultati all'interno della funzione di classe? ad esempio, ho una query che seleziona tutto da una tabella e quindi restituisce un set di risultati di recupero di tutti. È possibile scorrere il set di risultati all'interno di una funzione di classi? ad esempioclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111

22

L'esempio fornito non è PHP valido e presenta alcuni problemi:

public scoreTest() {
    ...
}

non è una dichiarazione di funzione corretta: è necessario dichiarare le funzioni con la parola chiave "function".

La sintassi dovrebbe piuttosto essere:

public function scoreTest() {
    ...
}

In secondo luogo, il wrapping delle funzioni bigTest () e smallTest () in public function () {} non le rende private: dovresti usare la parola chiave private su entrambe singolarmente:

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

Inoltre, è convenzione utilizzare la maiuscola per i nomi delle classi nelle dichiarazioni di classe ("Test").

Spero che aiuti.


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

Penso che tu stia cercando qualcosa di simile a questo.

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

Per avere una "funzione nella funzione", se ho capito cosa stai chiedendo, hai bisogno di PHP 5.3, dove puoi sfruttare la nuova funzionalità di chiusura.

Quindi potresti avere:

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

3

Per chiamare qualsiasi metodo di un oggetto istanziato da una classe (con l'istruzione new), è necessario "puntare" ad esso. Dall'esterno usi solo la risorsa creata dalla nuova dichiarazione. All'interno di qualsiasi oggetto PHP creato da new, salva la stessa risorsa nella variabile $ this. Quindi, all'interno di una classe DEVI puntare al metodo con $ this. Nella tua classe, per chiamare smallTestdall'interno della classe, devi dire a PHP quale di tutti gli oggetti creati dalla nuova istruzione vuoi eseguire, scrivi semplicemente:

$this->smallTest();

Errore irreversibile: utilizzo di $ this quando non è nel contesto dell'oggetto
Stnfordly

2

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

example2

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 (); ---- Errore irreversibile: impossibile dichiarare nuovamente bigTest () (precedentemente dichiarato.
tfont

2

Puoi anche usare self::CONSTinvece di $this->CONSTse vuoi chiamare una variabile statica o una funzione della classe corrente.


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

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

    f2();  

    }

produzione :

f2 corri f1 corri

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.