3

我试图在运行时配置一个对象,传递一个回调函数,如下所示:

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:我更喜欢使用回调。

4

2 回答 2

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)

这表明回调已执行,并且您的对象的属性确实已按预期设置。

于 2012-05-18T17:56:45.300 回答
6

如果您正在使用(或愿意升级到)PHP 5.4,您可以使用ClosuresbindTo的新方法。这允许您将闭包“重新绑定”到新范围。

在调用之前$callback,您可以将其设置$this为您想要的。

if(is_callable($callback)){
    $callback = $callback->bindTo($this, $this);
    $callback();
}

演示:http ://codepad.viper-7.com/lRWHTn

您也可以bindTo在课堂外使用。

$func = function(){
  $this->property = 'value';
  $this->anotherProperty = 'anotherValue';
};
$myObject->configure($func->bindTo($myObject, $myObject));

演示:http ://codepad.viper-7.com/mNgMDz

于 2012-05-18T18:08:51.387 回答