在类/对象中注入和使用命名函数的正确方法?

时间:2014-10-26 11:38:40

标签: php class dependency-injection

当需要在类/对象中注入普通的命名函数时,常见的做法是什么?我可以注入一个用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()起作用吗?如果没有,为什么?

1 个答案:

答案 0 :(得分:0)

@bitWorking的评论激发了我的灵感。似乎可以这样做:

$test = new Test(array('Some', 'func'));
$test -> run(); // Works!
$test -> run2(); // Works!
$test -> run3(); // Works!

不应传递'Some::func',而应传递array('Some', 'func')