Вызов функции в методе класса?

108

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

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

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

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

WAC0020
источник
2
Просто чтобы убедиться: функция и метод - это один и тот же метод function ===. Термин «метод» чаще используется в объектно-ориентированном языке для описания функции класса.
Маркус
Причина, по которой отсутствуют некоторые условия, заключается в том, что я уходил из офиса, поэтому у меня было мало времени.
WAC0020,

Ответы:

201

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

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
Можно ли запустить function()с другой страницы .php внутри функции класса, а затем получить результаты внутри функции класса? например, у меня есть запрос, который выбирает все из таблицы, а затем возвращает набор результатов выборки всего. Можно ли просмотреть этот набор результатов внутри функции классов? напримерclass query{ public function show(){ getResults(); while($stmt->fetchCollumn()){ ECHO RESULTS HERE }
James111
22

Предоставленный вами образец недействителен для 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;
    }
}

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

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

Pjbeardsley
источник
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

Я думаю, вы ищете что-то подобное.

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

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

Гамбо
источник
3

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

Итак, у вас могло быть:

public function newTest() {
   $bigTest = function() {
        //Big Test Here
   }
}
болван
источник
3

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

$this->smallTest();
Ingeniero
источник
Неустранимая ошибка: использование $ this вне контекста объекта
Стнфордли
2

пример 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();

пример2

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
источник
$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- Неустранимая ошибка: невозможно повторно объявить bigTest () (объявлено ранее.
tfont
2

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

AlexioVay
источник
2
  class sampleClass
    { 
        public function f1()
        {
           return "f1 run";
        }

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

    f2();  

    }

вывод :

f2 запустить f1 запустить

Масуд Сиахкали
источник