我想要一个函数,每次引用一个类(被调用)时都会调用它.
魔术函数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(self)的原因;是它使你能够将魔术方法声明为final,并且仍然让它们在子类中按预期工作:
class Foobar extends Foo
{}
Foobar::bar();//output: You called Foobar::bar statically
关于魔法的更多细节:
> The docs,当然
>我之前的一些答案explaining why __call
& co are slow
>以及为什么你应该预先声明属性(与__call为什么慢的原因相同)here