2012-05-11 5 views
2

Я пытаюсь использовать метод экземпляра в качестве обратного вызова для PHP 5.2.1. Я знаю, что с PHP 5.4 вы можете использовать $this внутри закрытия, а в PHP 5.3 вы можете переименовать $this в $self и передать это закрытию. Тем не менее, ни один из этих методов не будет достаточным, поскольку мне нужно, чтобы это работало для PHP 5.2.1. Две последние строки были моей последней попыткой. Это приводит к Fatal error: Call to a member function hello() on a non-object - есть ли в любом случае, я могу иметь обратный вызов метода экземпляра в PHP 5.2.1?

<?php 

class Test { 

    public function __construct() { 
     $self = &$this; 

     $cb = function() use ($self) { 
      $self->hello(); 
     }; 
     call_user_func($cb); 


     // $cb = create_function('$self', '$self->hello();'); 
     // call_user_func($cb); 

    } 

    public function hello() { 
     echo "Hello, World!\n"; 
    } 
} 

$t = new Test(); 

ответ

1
$cb = create_function('$self', '$self->hello();'); 

Это просто делает функцию, которая может принимать параметр, называемый $self. Это так же, как это:

function test($self){ 
    $self->hello(); 
} 

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

call_user_func($cb, $this); 

Вы также можете попробовать сделать $self глобальную переменную, так что анонимная функция, сделанная create_function, может ее прочитать.

$GLOBALS['mySelf'] = $self; 
$cb = create_function('', 'global $mySelf; $mySelf->hello();'); 
call_user_func($cb); 
// You may want to unset this when done 
unset($GLOBALS['mySelf']); 
+0

Ahhhh, perfect! – v0idless

+0

Рад я мог бы помочь :-) –

3

Передайте массив для включения объекта:

call_user_func(array($this, 'hello')); 

http://us3.php.net/manual/en/language.types.callable.php

+0

Вы абсолютно правы. Я должен был указать, что я не могу изменить call_user_func в этом конкретном контексте. Решение Rocket подходит точно. – v0idless

1

Как насчет ПРОСТОТА?

class Test { 

    public function __construct() { 
     $this -> funcName($this); 
    } 

    public function funcName($obj) { 
      $obj->hello(); 
    } 

    public function hello() { 
     echo "Hello, World!\n"; 
    } 
} 

Update: Просто протестировали коды. Они отлично работают с этим.

call_user_func_array(array($self, "hello"), array()); 
+1

+1 для простоты, однако это всего лишь свернутый пример конкретного интерфейса, к которому я должен придерживаться. – v0idless