我有一个基类,其中__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
。
为了避免这种行为,你可以使用一个空的代理类,它在运行时不会链接parent
和MyBaseClass
:
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