2013-03-06 4 views
2

У меня есть класс:Ссылка PHP класс метод функции

class demo { 

     function newDemo(){ 
      $v=$this->checkDemo; 
      $v('hello'); // not working this reference, or how to do this? 
     } 

     function checkDemo($a){ 
      ... 
      return $a; 
     } 
      } 

Итак, как я могу ссылаться на метод функций checkDemo внутри класса?

+0

При вызове метода checkDemo вы должны дать скобки(). Во-вторых, я не знаю, что будет делать $ v ('hello'), можете ли вы привести пример? – Voitcus

+2

@Voitcus выглядит так, как намерение OP состоит в том, чтобы сохранить ссылку на функцию в '$ v', а затем выполнить переменную функцию' $ v', которая передаст 'hello' на 'checkDemo()'. –

+0

@MichaelBerkowski ОК, приведенный выше пример несколько смущал меня – Voitcus

ответ

3

Вы назначаете его следующим образом:

$v = 'checkDemo'; 
$this->$v('hello'); 

За дополнительной информацией обращайтесь к the documentation.

Хотя я не совсем уверен почему вы бы это сделали, вот как.

+1

Любые объяснения для downvote? –

+0

+1, это самый простой ответ, и он отлично работает :) –

+0

@tom это то, что я ищу. благодаря –

0

Не было бы намного проще и проще, если бы вы просто:

class demo { 

     function newDemo(){ 
      echo $this->checkDemo('hello'); 
     } 

     function checkDemo($a){ 
      return $a; 
     } 
} 

$demo = new demo; 

$demo->newDemo(); // directly outputs "hello", either to the browser or to the CLI 
-2

Вы должны добавить аргументы при вызове функции:

$v = $this->checkDemo('hello'); 
+0

Почему это проголосовали? Он просто спросил, как ссылаться на функцию из класса. Ничего сложного, как вызов функции из строки или объекта. – Sam

+0

'вызов функции из строки или объекта' - это именно то, что он хотел. –

+0

Я стою исправлен, но это не то, что он спросил: 'reference checkDemo метод метода внутри класса'. – Sam

4

Чтобы сделать вызываемым из object, вам нужен массив. Индекс 0 является экземпляр, а индекс 1 это имя метода:

$v = Array($this,"checkDemo"); 
$v("hello"); 

EDIT: Обратите внимание, что эта функция доступна только в PHP 5.4

+1

Почему это было приостановлено? –

+1

Я не понимал, что это действительно сработало! : O Я думал, что 'array ($ this, 'checkDemo')' работает только с 'call_user_func'. –

+1

Это работает только в PHP 5.4+ –

1

PHP Manual

<?php 
class Foo 
{ 
    function Variable() 
    { 
     $name = 'Bar'; 
     $this->$name(); // This calls the Bar() method 
    } 

    function Bar() 
    { 
     echo "This is Bar"; 
    } 
} 

$foo = new Foo(); 
$funcname = "Variable"; 
$foo->$funcname(); // This calls $foo->Variable() 

?> 
0

Это бесполезно, когда вы можете напрямую позвонить $ this-> checkDemo ($ данные)

Однако .... Вы можете сделать, как это

$v=function($text){ return $this->checkDemo($text); }; 
echo $v('hello'); 
0

Просто вызов call_user_func Функция и массив передачи состоят из ссылки на объект и имя метода в качестве первого параметра:

class demo { 

     function newDemo(){ 
      return call_user_func(array($this, 'checkDemo'), 'hello'); 
     } 

     function checkDemo($a){ 
      ... 
      return $a; 
     } 
} 
0

Один из способов сделать это:

<?php 
class HelloWorld { 

    public function sayHelloTo($name) { 
     return 'Hello ' . $name; 
    } 

public function test() { 
    $reflectionMethod = new ReflectionMethod(__CLASS__, 'sayHelloTo'); 
    echo $reflectionMethod->invoke($this, 'Mike'); 

    } 

} 

$hello = new HelloWorld(); 
$hello->test(); 

http://www.php.net/manual/en/reflectionmethod.invoke.php

Смежные вопросы