我正在尝试在运行时配置一个对象,传递一个类似的回调函数:
class myObject{
protected $property;
protected $anotherProperty;
public function configure($callback){
if(is_callable($callback)){
$callback();
}
}
}
$myObject = new myObject(); //
$myObject->configure(function(){
$this->property = 'value';
$this->anotherProperty = 'anotherValue';
});
当然我收到以下错误:
致命错误:不在对象上下文中时使用$ this
我的问题是,是否有办法在回调函数中使用$this
来实现此行为,或者可能会获得更好模式的建议。
PS:我更喜欢使用回调。
答案 0 :(得分:6)
从您的想法开始,您可以将$this
作为参数传递给回调
但请注意您的回调 (未在您的班级中声明) 将无法访问受保护的属性/方法 - 这意味着你必须设置公共方法来访问它们。
您的课程将如下所示:
class myObject {
protected $property;
protected $anotherProperty;
public function configure($callback){
if(is_callable($callback)){
// Pass $this as a parameter to the callback
$callback($this);
}
}
public function setProperty($a) {
$this->property = $a;
}
public function setAnotherProperty($a) {
$this->anotherProperty = $a;
}
}
你已经宣布回调,并使用它,就像这样:
$myObject = new myObject(); //
$myObject->configure(function($obj) {
// You cannot access protected/private properties or methods
// => You have to use setters / getters
$obj->setProperty('value');
$obj->setAnotherProperty('anotherValue');
});
紧接着之后调用以下代码行:
var_dump($myObject);
输出这个:
object(myObject)[1]
protected 'property' => string 'value' (length=5)
protected 'anotherProperty' => string 'anotherValue' (length=12)
这表明已经执行了回调,并且确实已按预期设置了对象的属性。
答案 1 :(得分:6)
如果您正在使用(或愿意升级到)PHP 5.4,则可以使用bindTo
的新Closures方法。这允许您将闭包“重新绑定”到新范围。
在致电$callback
之前,您可以将$this
设置为您想要的内容。
if(is_callable($callback)){
$callback = $callback->bindTo($this, $this);
$callback();
}
DEMO:http://codepad.viper-7.com/lRWHTn
您也可以在课堂外使用bindTo
。
$func = function(){
$this->property = 'value';
$this->anotherProperty = 'anotherValue';
};
$myObject->configure($func->bindTo($myObject, $myObject));