通知课堂电话 – php

我想要一个函数,每次引用一个类(被调用)时都会调用它.

魔术函数autoload做了类似的事情,但只有在引用的类不存在时才有效.

我想创建一个在任何情况下都能工作的函数.

例如:

<?php

class Foo {

    static function bar () {
        ...
    }
}

function __someMagicFunction ($name) {
    echo 'You called class ' . $name;
}

Foo::bar(); // Output: You called class Foo

我希望输出为“你叫做类Foo”.

我该怎么做?
谢谢 :)

最佳答案 嗯,没有简单的方法可以做到这一点,但这是可能的.但是,不建议您采用这种方式,因为它会导致代码速度变慢.但是,这是一个简单的方法:

class Foo
{
    //protected, not public
    protected static function bar ()
    {
    }
    protected function nonStaticBar()
    {
    }
    public function __call($method, array $args)
    {
        //echoes you called Foo::nonStaticBar
        printf('You called %s::%s', get_class($this), $method);
        //perform the actual call
        return call_user_func_array([$this, $method], $args);
    }
    //same, but for static methods
    public static function __callStatic($method, array $args)
    {
        $calledClass = get_called_class();//for late static binding
        printf('You called %s::%s statically', $calledClass, $method);
        return call_user_func_array($calledClass . '::' . $method, $args);
    }
}
$foo = new Foo;
$foo->nonStaticBar();//output: You called Foo::nonStaticBar
Foo::bar();//output: You called Foo::bar statically

__callStatic使用get_called_class而不是get_class(s​​elf)的原因;是它使你能够将魔术方法声明为final,并且仍然让它们在子类中按预期工作:

class Foobar extends Foo
{}

Foobar::bar();//output: You called Foobar::bar statically

demo

关于魔法的更多细节:

> The docs,当然
>我之前的一些答案explaining why __call & co are slow
>以及为什么你应该预先声明属性(与__call为什么慢的原因相同)here

点赞