Вызов функции внутри метода класса? - PullRequest
98 голосов
/ 12 ноября 2009

Я пытался понять, как это сделать, но я не совсем уверен, как.

Вот пример того, что я пытаюсь сделать:

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

Вот часть, с которой у меня проблемы, как я могу вызвать bigTest ()?

Ответы [ 10 ]

192 голосов
/ 12 ноября 2009

Попробуйте это:

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();
18 голосов
/ 12 ноября 2009

Предоставленный вами пример не является допустимым PHP и имеет несколько проблем:

public scoreTest() {
    ...
}

не является правильным объявлением функции - вам нужно объявить функции с ключевым словом 'function'.

Синтаксис должен быть:

public function scoreTest() {
    ...
}

Во-вторых, обертывание функций bigTest () и smallTest () в public function () {} не делает их приватными - вы должны использовать ключевое слово private для каждого из них по отдельности:

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

Кроме того, принято объявлять заглавные буквы в объявлениях классов («Test»).

Надеюсь, это поможет.

8 голосов
/ 06 сентября 2015

Я думаю, вы ищете что-то вроде этого.

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();
6 голосов
/ 13 июля 2017
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;
    }
 }
4 голосов
/ 24 декабря 2014

Чтобы вызвать любой метод объекта, созданного из класса (с оператором new), вам нужно «указать» на него. Со стороны вы просто используете ресурс, созданный новым оператором. Внутри любого объекта PHP, созданного new, сохраняется тот же ресурс в переменной $ this. Итак, внутри класса вы ДОЛЖНЫ указывать на метод с помощью $ this. В вашем классе, чтобы вызвать smallTest изнутри класса, вы должны сообщить PHP, какой из всех объектов, созданных новым оператором, который вы хотите выполнить, просто напишите:

$this->smallTest();
3 голосов
/ 10 декабря 2016
  class sampleClass
    { 
        public function f1()
        {
           return "f1 run";
        }

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

    f2();  

    }

вывод:

f2 run f1 пробег

3 голосов
/ 12 ноября 2009

Чтобы иметь «функцию внутри функции», если я понимаю, что вы спрашиваете, вам нужен PHP 5.3, где вы можете воспользоваться новой функцией Closure.

Так что вы могли бы иметь:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}
3 голосов
/ 12 ноября 2009

Вам нужно вызвать newTest, чтобы сделать функции, объявленные внутри этого метода, «видимыми» (см. Функции внутри функций ). Но тогда это просто обычные функции и никаких методов.

1 голос
/ 23 августа 2016

Вы также можете использовать self::CONST вместо $this->CONST, если хотите вызвать статическую переменную или функцию текущего класса.

0 голосов
/ 07 октября 2013

пример 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')
...