我的代码是这样的:

<?php

class A {

    public function CallA()
    {
        echo "callA" . PHP_EOL;
    }

    public static function CallB()
    {
        echo "callB" . PHP_EOL;
    }

    public static function __callStatic($method, $args)
    {
        echo "callStatic {$method}";
    }
}

A::CallA();

但它会回显:
Strict Standards: Non-static method A::CallA() should not be called statically in /vagrant/hades_install/public/test.php on line 21
callA

也就是说,CallA没有碰到函数__callStatic
如果我想使用__callStatic调用A::CallA(),该怎么办

最佳答案

正如documentation解释的那样:



您的代码中的方法CallA()可以访问的,这就是为什么PHP不使用__callStatic()并直接调用CallA()是唯一的选择的原因。

您可以通过使__callStatic()不可访问(重命名或将其可见性更改为CallA()protected)或直接调用(丑陋的解决方法)来强制private的调用:

A::__callStatic('CallA', array());

如果选择保护CallA(),则需要实现 __call() 方法才能再次调用CallA():
class A {

    protected function CallA()
    {
        echo "callA" . PHP_EOL;
    }

    public static function CallB()
    {
        echo "callB" . PHP_EOL;
    }

    public static function __callStatic($method, $args)
    {
        echo "callStatic {$method}" . PHP_EOL;
    }

    public function __call($method, $args)
    {
        if ($method == 'CallA') {
            $this->CallA();
        }
    }
}

A::CallA();
A::__callStatic('CallA', array());

$x = new A();
$x->CallA();

它输出:
callStatic CallA
callStatic CallA
callA

关于php - 如果存在非静态函数,则__callStatic不调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31039380/

10-12 14:21