使用$ this回调函数

时间:2012-05-11 16:36:00

标签: php

我正在尝试使用实例方法作为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();

3 个答案:

答案 0 :(得分:3)

传递数组以包含对象:

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

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

答案 1 :(得分: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']);

答案 2 :(得分:1)

SIMPLICITY 怎么样?

class Test {

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

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

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

更新:刚刚测试了代码。他们使用这个工作正常。

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