php – 显式调用基类的成员函数

前端之家收集整理的这篇文章主要介绍了php – 显式调用基类的成员函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基类,定义了魔术方法__call和_callStatic,以便处理对未声明的成员函数调用.

当你同时拥有非静态和静态的两者时,似乎无法从派生类中调用静态的,因为静态运算符::如果与父类一起使用,则不隐式表示静态,或者在本例中,基类的名称.这是一个特殊的语法: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.

要避免此类行为,您可以使用空代理类,即在运行时不链接父代和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

原文链接:https://www.f2er.com/php/136577.html

猜你在找的PHP相关文章