PHP - 使用静态方法动态扩展父类

时间:2015-03-05 13:56:16

标签: php inheritance static

考虑以下事项:

class A
{
    public static function bark()
    { echo 'woof'; }
}

class B extends A
{
    public static function speak()
    { echo 'hello'; }
}

A::speak();

// Fatal error: Call to undefined method A::speak()

如何使用尚未知的方法在该类中使用您需要全局可用的方法扩展类,但是在运行时加载,具体取决于应用程序的流程?

确定我们可以traits并将use放在类中:

trait B
{
    public static function speak()
    { echo 'hello'; }
}

class A
{
    use B;
    public static function bark()
    { echo 'woof'; }
}

A::speak();

// hello
  • 但是use B未被动态调用,因此您必须手动更新每个可用的新特征的A类。 这是荒谬的,为什么迫使开发人员试图完成一些如此简单的事情来打破他们的大脑?

有没有人知道如何以干净的方式完成这项工作?我的意思是我已经看到了一些令人印象深刻的方法,通过使用单例,命名空间,回调和工作,但在每种情况下,它需要比实际需要更多的代码和重复编程。 无论是那个还是我完全错过了这条船哈哈! 在此先感谢您的帮助,我们将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为通过一些创造力,您可以使用__call魔术方法。 你可以这样做:

class A
{
    /**
     * @var array
     */
    protected $methods = [];

    public function __call($name, $arguments)
    {
        if (!empty($this->methods[$name]) && is_callable($this->methods[$name])) {
            return call_user_func_array($this->methods[$name], $arguments);
        }
    }

    public function addMethod($name, Closure $method)
    {
        $this->methods[$name] = $method;
    }
}

// get class instance (A have no methods except of addMethod)
$instance = new A();

// add methods on runtime
$instance->addMethod('sum', function($num1, $num2) {
    return $num1 + $num2;
});

$instance->addMethod('sub', function($num1, $num2) {
    return $num1 - $num2;
});

// use methods exactly the same way as implemented fixed on class
echo $instance->sum(2, 2);
echo $instance->sub(3, 2);

当然,您也可以将__callStatic用于静态方法。如果你想让它变得更复杂也可以使用依赖注入的概念来添加对象而不是方法。然后通过注入的对象搜索被调用的方法,并在找到它时调用它。 我希望这至少能给你一个好主意。