Php 静态方法的神秘行为

Php 静态方法的神秘行为,php,Php,所以这个问题很好,因为它解释了不从类本身调用_callStatic的奇怪行为(注意,我在5.3.3中没有看到这种行为,但在5.3.8和5.3.12中看到)。似乎只能从类外部调用_callStatic。这是事实。但是如果我真的想从我的类中调用_callStatic,我该怎么办?我应该使用什么语法来解决这个问题?您可以将功能抽象到另一个方法,如Class::magicCall($method,$args),然后从u callStatic()中调用它。这样,您也可以通过直接调用Class::magic

所以这个问题很好,因为它解释了不从类本身调用_callStatic的奇怪行为(注意,我在5.3.3中没有看到这种行为,但在5.3.8和5.3.12中看到)。似乎只能从类外部调用_callStatic。这是事实。但是如果我真的想从我的类中调用_callStatic,我该怎么办?我应该使用什么语法来解决这个问题?

您可以将功能抽象到另一个方法,如Class::magicCall($method,$args),然后从u callStatic()中调用它。这样,您也可以通过直接调用Class::magicCall()来访问该功能。

它不必来自类之外,只需不来自对象上下文(即,
$this
是该类的实例)。因此,您可以将此调用包装在静态方法中,例如:

class TestCallStatic
{
    public function __call($func, $args)
    {
        echo "__call($func)";
    }

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

    public function test()
    {
        self::_test();
    }
    protected static function _test()
    {
        self::i_am_static();
    }
}

$test = new TestCallStatic();
$test->test();
输出:

__callStatic(我是静态的)


你能包括一个测试用例吗?这就是解决方案。这是为了让您理解要调用静态函数的php解释器。通过使用helper静态函数_test,可以避免不明确的调用。我的代码中唯一的区别是需要使用$this,所以:self::test($this);静态功能测试($myClassInstance)我会尝试将需要
$this
的部分与不需要的部分分开(只将“静态”部分移动到
\u测试中
)-如果您的类可以这样做的话。它使封装更容易,代码看起来更干净。在5.3.3、5.3.8和5.3.12上成功测试