我正在尝试做一些类似于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
,即使它不是静态方法并且是在对象范围内调用的。