Виклик функції у методі Class?


108

Я намагався розібратися, як робити це, але я не зовсім впевнений, як це зробити.

Ось приклад того, що я намагаюся зробити:

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

Ось частина, з якою у мене виникають проблеми, як я називаю bigTest ()?


2
Просто для переконання: функція та метод - це точно та сама функція === метод. Термін метод частіше використовується в мові ОО для опису функції класу.
markus

Причиною відсутності деяких термінів є те, що я виїжджав з офісу, тому мені не вистачало часу.
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 () в загальнодоступну функцію () {} не робить їх приватними - слід використовувати приватне ключове слово для обох цих варіантів окремо:

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

Крім того, умовно використовувати великі імена класів у деклараціях класів ("Тест").

Сподіваюся, що це допомагає.


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, де ви можете скористатися новою функцією закриття.

Так ви могли:

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

3

Для виклику будь-якого методу об'єкта, ініційованого з класу (із заявою new), вам потрібно "вказати" на нього. Ззовні ви просто використовуєте ресурс, створений новим оператором. Всередині будь-якого об’єкта PHP, створеного новим, зберігає той самий ресурс у $ цій змінній. Отже, всередині класу ви ОБОВ'ЯЗКОВО вказуєте на метод $ this. У вашому класі, щоб зателефонувати smallTestзсередини класу, ви повинні сказати PHP, який із усіх об'єктів, створених новим оператором, який ви хочете виконати, просто напишіть:

$this->smallTest();

Фатальна помилка: використання $ this, коли не в об'єктному контексті
Stnfordly

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

$ rentry-> newTest () -> bigTest (); $ rentry-> newTest () -> smallTest (); ---- Фатальна помилка: Неможливо переоформити bigTest () (раніше оголошено.
tfont

2

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


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

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

    f2();  

    }

вихід:

f2 run f1 run

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.