当需要在类/对象中注入普通的命名函数时,常见的做法是什么?我可以注入一个用function() {}
创建的匿名函数/闭包,但大多数时候我可能更喜欢传统的静态函数。
例如,我想在类Some::func()
中注入一个名为Test
的函数。我只是将函数的名称作为字符串传递给我吗?或者还有其他更好的方法吗?
这是我到目前为止所提出的:
class Test {
private $func;
public function __construct($func) {
$this -> func = array(
'name' => $func
);
}
public function run() {
$this -> func['name']();
}
public function run2() {
Some::func();
}
public function run3() {
call_user_func_array($this -> func['name'], array());
}
}
class Some {
static function func() {
echo 'Success!';
}
}
$test = new Test('Some::func');
$test -> run(); // Call to undefined function Some::func()
$test -> run2(); // Works!
$test -> run3(); // Works!
第一个run()
看起来好多了,虽然不行。这个错误对我来说听起来很奇怪,因为Some::func()
在其中明确定义,因为其他方式正常工作。
对我来说call_user_func_array()
是唯一的方法吗?有什么方法可以让第一种方法run()
起作用吗?如果没有,为什么?
答案 0 :(得分:0)
@bitWorking的评论激发了我的灵感。似乎可以这样做:
$test = new Test(array('Some', 'func'));
$test -> run(); // Works!
$test -> run2(); // Works!
$test -> run3(); // Works!
不应传递'Some::func'
,而应传递array('Some', 'func')
。