2014-01-30 8 views
0

Пример:Вернуть ссылку на метод?

Class Test { 
    private function __construct() {} 

    public static function init() { 
     $new_test = new Test(); 
     return $new_test->inner_test; 
    } 

    public function inner_test() { 
     print '!!!!'; 
    } 
} 

$test = Test::init(); 
$test(); 

Возвращает «PHP Фатальная ошибка: Имя функции должно быть строкой»

Есть ли способ сделать это поведение типа Javascript в PHP?

+0

PHP не может возвращать функциональные ссылки, такие как JS can. Возможно, попробуйте прочитать на http://php.net/manual/functions.anonymous.php – Phil

+0

@Phil, да это может ... Вы просто назначаете переменную указателю. Он был близок, но, поскольку он назначает класс, он должен использовать массив. – Thomas

+0

@Thomas Нет, это не может – Phil

ответ

0

Ниже PHP 5.4

Class Test { 
    private function __construct() {} 

    public static function init() { 
     $new_test = new Test(); 
     return $new_test->inner_test(); 
    } 

    public function inner_test() { 
     print '!!!!'; 
    } 
} 

$test = array('Test','init'); 
call_user_func($test); 

Для Phil:

function test(){ 
echo "Hello"; 
} 
$test = test; 
$test(); 

Run, что в песочнице.

+0

Теперь, когда я смотрю на это, это работает только на более новых версиях PHP, что я и использую в первую очередь. – Thomas

+0

Этот синтаксис '$ test()' для меня является новым. Не удается найти документальную ссылку на него, хотя – Phil

+0

Ваш маленький пример дает мне * PHP Примечание: использование неопределенного постоянного теста - предполагаемый «тест» *. Это просто расширение строки PHP. Ваш пример с '$ test = ['Test', 'init']; $ test() 'was cooler – Phil

0

Спасибо Фил за ссылку. Это работает:

Class Test { 
    private function __construct($myString) { 
     $this->myString = $myString; 
    } 

    public static function init($myString) { 
     $new_test = new Test($myString); 
     return function() use (&$new_test) {$new_test->inner_test();}; 
    } 

    public function inner_test() { 
     print $this->myString; 
    } 
} 

$test = Test::init('Lorem Ipsum Dolar'); 
$test(); 
+0

Как примечание, анонимные функции не существовали до PHP 5.3 – Thomas

+0

Да. Я не буду использовать это из-за этого ограничения, но это именно то, что я искал. – Joren

+0

Проверьте мой ответ, я отредактировал его, чтобы он работал с любым PHP по большей части. – Thomas

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