我尝试做类似PHP anonymous function assigned to class property in constructor is always 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
不存在的错误。如果我在方法is_callable
中放置OutPut()
测试,我发现$this->func
实际上是可调用的,但错误仍然存在。
但是,如果我使用is_callable
的第三个参数,我可以正常工作。
public function OutPut($arg) {
return is_callable($this->func,false,$tmpfunc) ? $tmpfunc($arg) : null;
}
这如何作为解决方案叠加?好奇你的想法。
答案 0 :(得分:2)
因为没有办法让PHP将$this->func()
解析为变量函数,所以你有两个选择:
return call_user_func_array($this->func, array($arg));
或者:
$func = $this->func;
return $func($arg);
is_callable()
将返回静态方法调用someClass::someMethod
,即使它不是静态方法并且在对象范围内调用。