Wywołanie funkcji w ramach metody Class?

108

Próbowałem wymyślić, jak to zrobić, ale nie jestem pewien, jak to zrobić.

Oto przykład tego, co próbuję zrobić:

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

Oto część, z którą mam problemy, jak wywołać bigTest ()?

WAC0020
źródło
2
Dla pewności: funkcja i metoda to dokładnie ta sama metoda function ===. Termin metoda jest częściej używany w języku OO do opisu funkcji klasy.
markus
Powodem, dla którego brakuje niektórych terminów, jest to, że wychodziłem z biura, więc miałem mało czasu.
WAC0020

Odpowiedzi:

201

Spróbuj tego:

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
źródło
1
Czy można uruchomić function()z innej strony .php wewnątrz funkcji klasy, a następnie pobrać wyniki wewnątrz funkcji klasy? np. mam zapytanie, które wybiera wszystko z tabeli, a następnie zwraca zestaw wyników pobierania wszystkich. Czy można przejść przez ten zestaw wyników wewnątrz funkcji klas? np.class query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111
22

Podana próbka nie jest poprawnym językiem PHP i zawiera kilka problemów:

public scoreTest() {
    ...
}

nie jest poprawną deklaracją funkcji - musisz zadeklarować funkcje za pomocą słowa kluczowego „function”.

Składnia powinna raczej wyglądać następująco:

public function scoreTest() {
    ...
}

Po drugie, zawijanie funkcji bigTest () i smallTest () w public function () {} nie czyni ich prywatnymi - powinieneś użyć słowa kluczowego private na obu z nich osobno:

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

Konwencją jest również zapisywanie nazw klas wielkimi literami w deklaracjach klas („Test”).

Mam nadzieję, że to pomoże.

pjbeardsley
źródło
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
źródło
10

Myślę, że szukasz czegoś takiego.

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
źródło
3

Musisz wywołać, newTestaby funkcje zadeklarowane wewnątrz tej metody były „widoczne” (zobacz Funkcje wewnątrz funkcji ). Ale to są tylko normalne funkcje i brak metod.

Gumbo
źródło
3

Aby mieć „funkcję w funkcji”, jeśli rozumiem, o co pytasz, potrzebujesz PHP 5.3, w którym możesz skorzystać z nowej funkcji Zamknięcia.

Więc możesz mieć:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}
bałwan
źródło
3

Aby wywołać jakąkolwiek metodę obiektu utworzonego z klasy (z instrukcją new), musisz na nią „wskazać”. Z zewnątrz po prostu korzystasz z zasobu utworzonego przez nową instrukcję. Wewnątrz dowolnego obiektu PHP utworzonego przez new, zapisuje ten sam zasób w zmiennej $ this. Więc wewnątrz klasy MUSISZ wskazać metodę za pomocą $ this. W Twojej klasie, aby wywołać smallTestz wnętrza klasy, musisz powiedzieć PHP, który ze wszystkich obiektów utworzonych przez nową instrukcję chcesz wykonać, po prostu napisz:

$this->smallTest();
Ingeniero
źródło
Błąd krytyczny: użycie $ this poza kontekstem obiektu
Stnfordly
2

Przykład 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();

przykład2

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
źródło
$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- Błąd krytyczny: nie można ponownie zadeklarować bigTest () (poprzednio zadeklarowany.
tfont
2

Możesz także użyć self::CONSTzamiast, $this->CONSTjeśli chcesz wywołać zmienną statyczną lub funkcję bieżącej klasy.

AlexioVay
źródło
2
  class sampleClass
    { 
        public function f1()
        {
           return "f1 run";
        }

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

    f2();  

    }

wynik :

f2 run f1 run

Masoud Siahkali
źródło