Php __如果存在非静态函数,则callStatic不调用

Php __如果存在非静态函数,则callStatic不调用,php,Php,我的代码是这样的: <?php class A { public function CallA() { echo "callA" . PHP_EOL; } public static function CallB() { echo "callB" . PHP_EOL; } public static function __callStatic($method, $args) {

我的代码是这样的:

<?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();
也就是说,
CallA
没有运行到函数
\uu callStatic

如果我想使用
A::CallA()

调用
\u callStatic
,我该怎么办,正如下面的解释:

在静态上下文中调用不可访问的方法时触发

代码中的方法
CallA()
是可访问的,这就是为什么PHP不使用
\uu callStatic()
并且直接调用
CallA()
是它唯一的选择

您可以通过使
CallA()
不可访问(将其重命名或将其可见性更改为
protected
private
)或直接调用它来强制调用
\callStatic()

如果选择使
CallA()
受保护,则需要实现该方法才能再次调用
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

另一种方法是保持非静态方法的完整性,并在静态调用它时使用前缀,解析
\uu callStatic
中的方法名称

class A {

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

    public static function __callStatic($method, $args)
    {
        $method_name = ltrim($method, '_');
        echo "callStatic {$method_name}" . PHP_EOL;

        $instance = new A();
        return instance->$method_name(...$args); //this only works in PHP 5.6+, for earlier versions use call_user_func_array
    }

}

A::_CallA();
这将输出:

callStatic callA
callA

如果您可以将
CallA
的公共访问更改为protected或private,那么您将看到
\uu callStatic()
按预期在
CallA
之前触发,但这意味着没有
\uu callStatic()
就无法调用
CallA
。。。难题!PHP中方法的
static
关键字或多或少只是建议性的。它根本不会对呼叫行为产生很大影响。
class A {

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

    public static function __callStatic($method, $args)
    {
        $method_name = ltrim($method, '_');
        echo "callStatic {$method_name}" . PHP_EOL;

        $instance = new A();
        return instance->$method_name(...$args); //this only works in PHP 5.6+, for earlier versions use call_user_func_array
    }

}

A::_CallA();
callStatic callA
callA