我正在尝试使用实例方法作为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();
答案 0 :(得分:3)
传递数组以包含对象:
call_user_func( array( $this, 'hello' ) );
答案 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());