1

SO question从非静态方法触发 __callStatic()的奇怪行为很好,因为它解释了 __callStatic 没有从类本身中调用的奇怪行为(请注意,我在 5.3.3 中没有看到这种行为,但在 5.3 .8 和 5.3.12)。似乎 __callStatic 只能从类外部调用。现在这是事实。但是,如果我真的希望在我的班级中调用 __callStatic,我该怎么办?我应该使用什么语法来解决这个问题?

4

2 回答 2

3

它不必来自类外部,而不必来自对象上下文(即$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(i_am_static)

于 2013-01-22T21:25:44.637 回答
0

您可以将功能抽象为另一个方法,例如 Class::magicCall($method, $args),并在 __callStatic() 中调用它。这样,您还可以通过直接调用 Class::magicCall() 来访问该功能。

于 2013-01-22T21:12:18.687 回答