将函数赋给类的属性


Assigning a function to a property of a class

我正在尝试做一些类似于PHP的事情,在构造函数中分配给类属性的匿名函数总是null?,但我的解决方案似乎更简单。我想听听Stack Overflow Hot Shots对这个解决方案的评论,以及是否有更好的解决方案。这是一个"最佳实践"问题。

我想将一个函数(匿名或定义的)传递给类/对象,然后能够调用该函数。我从这个开始:

function Foo($arg) {return sprintf('In Foo(%s)',$arg);}
function Bar($arg) {return sprintf('In Bar(%s)',$arg);}
class TestIt {
  private $func;
  public function __construct( $func ) { $this->func = $func; }
  public function OutPut($arg) {
    return $this->func($arg);
  }
}
$test  = new TestIt('Foo');
echo $test->OutPut('Bozo');

运行此程序时,我得到一个错误,即方法$this->func不存在。如果我在方法OutPut()中放入一个is_callable测试,我会发现$this->func实际上是可调用的,但错误仍然存在。

然而,如果我使用is_callable的第三个论点,我可以很好地工作。

public function OutPut($arg) {
  return is_callable($this->func,false,$tmpfunc) ? $tmpfunc($arg) : null;
}

作为一个解决方案,这是如何实现的?好奇你的想法。

因为没有办法让PHP将$this->func()解析为变量函数,所以这里有两个选项:

return call_user_func_array($this->func, array($arg));

或者:

$func = $this->func;
return $func($arg);

is_callable()将返回一个静态方法调用someClass::someMethod,即使它不是静态方法并且是在对象范围内调用的。