显式静态调用基类的成员函数


Call a base class' member function explicitly static

我有一个基类,其中__call_callStatic定义了魔术方法,以便处理对未声明成员函数的调用。

当您同时拥有非静态和静态时,似乎无法从派生类调用静态运算符,因为静态运算符 :: 如果与 parent 一起使用,或者在本例中,基类的名称,则不会隐式表示static。这是此处解释的特殊语法:http://php.net/manual/pl/keyword.parent.php

我在这里要做的是调用__callStatic的派生类失败,因为调用默认为非静态调用并由__call处理。

如何对基类的成员函数进行显式静态调用?

<?php
class MyBaseClass {
    public static function __callStatic($what, $args)
    {
        return 'static call';
    }
    
    public function __call($what, $args)
    {
        return 'non-static call';
    }
}
class MyDerivedClass extends MyBaseClass {
    function someAction()
    {
        //this seems to be interpreted as parent::Foo()
        //and so does not imply a static call
        return MyBaseClass::Foo(); //
    }
}
$bar = new MyDerivedClass();
echo $bar->someAction(); //outputs 'non-static call'
?>

请注意,删除非静态 __call 方法会使脚本输出"静态调用",因为在未声明__call时调用__callStatic

为了避免这种行为,你可以使用一个空的代理类,它在运行时不会链接parentMyBaseClass

class MyBaseClass {
    public static function __callStatic($what, $args)
    {
        return 'static call ' . PHP_EOL;
    }
    public function __call($what, $args)
    {
        return 'dynamic call ' . PHP_EOL;
    }
}
class ProxyClass extends MyBaseClass {
    //"Empty" class
}
class MyDerivedClass extends MyBaseClass {
    function someAction()
    {
        return ProxyClass::Foo();
    }
}
$bar = new MyDerivedClass();
var_dump($bar->someAction()); //outputs 'static call'

http://pastebin.com/7JMJUmXt