微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 从实例调用静态函数

我试图从其子类的成员调用静态魔术函数(__callStatic).问题是,它转向非静态__call.

<?PHP

ini_set("display_errors", true);

class a
{
    function __call($method, $params)
    {
        echo "instance";
    }

    static function __callStatic($method, $params)
    {
        echo "static";
    }
}

class b extends a
{
    function foo()
    {
        echo static::bar();
        // === echo self::bar();
        // === echo a::bar();
        // === echo b::bar();
    }
}

$b = new b();
echo PHPversion()."<br />";
$b->foo();

?>

输出

5.3.6
instance

如何让它显示“静态”?

解决方法:

如果删除魔术方法’__call’,您的代码将返回’static’.

根据http://php.net/manual/en/language.oop5.overloading.php“在静态上下文中调用不可访问的方法时会触发__callStatic()”.

我认为您的代码中发生的是,

>您正在从非静态上下文中调用静态方法.
>方法调用是在非静态上下文中,因此PHP搜索魔术方法’__call’.
> PHP触发魔术方法’_call’,如果它存在的话.或者,如果它不存在,它将调用’_callStatic’.

这是一个可能的解决方案:

class a
{
    static function __callStatic($method, $params)
    {
        $methodList =  array('staticmethod1', 'staticmethod2');

        // check if the method name should be called statically
        if (!in_array($method, $methodList)) {
            return false;
        }

        echo "static";

        return true;
    }

    function __call($method, $params)
    {
         $status = self::__callStatic($method, $params);
         if ($status) {
             return;
         }
         echo "instance";
    }

}

class b extends a
{
    function foo()
    {
        echo static::staticmethod1();
    }

    function foo2()
    {
        echo static::bar();
    }
}

$b = new b();
echo PHPversion()."<br />";
$b->foo();
$b->foo2();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐