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();
4

3 回答 3

3

传递一个数组以包含对象:

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

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

于 2012-05-11T16:42:03.800 回答
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']);
于 2012-05-11T16:41:09.897 回答
1

简单性怎么

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());
于 2012-05-11T16:44:17.247 回答