8

我有一个带有魔术方法的基类__call并已_callStatic定义,因此可以处理对未声明的成员函数的调用。

当你同时拥有非静态和静态的时,似乎不可能从派生类调用静态的,因为静态运算符::并不隐含地表示static如果与parent或在这种情况下,名称基类。这是这里解释的特殊语法: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方法会使脚本输出“静态调用”,因为未声明__callStatic时调用了。__call

4

1 回答 1

3

为了避免这种行为,您可以使用一个空的代理类,它不是链接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

于 2012-06-22T12:52:36.087 回答