我的代码看起来像这样:
abstract class Object
{
public static function __callStatic($name, $parameters)
{
$object = get_called_class();
$object = new $object;
if (method_exists($object, $name)) {
return call_user_func_array(array($object, $name), $parameters);
}
}
}
class Log extends Object
{
public function message($message)
{
echo 'Log: '.$message.'.<br>';
}
}
现在,我打电话给:
Log::message('test');
这个结果:
严格的标准:非静态方法Log :: message()不应该静态调用...
记录:测试。
有人可以帮帮我吗?答案 0 :(得分:2)
__callStatic
仅在您的方法不存在时才有效。
从&#34; message&#34;重命名您的方法到&#34; messageStatic&#34;并更改__callStatic
方法:
if (method_exists($object, $name.'Static')) {
return call_user_func_array(array($object, $name.'Static'), $parameters);
}
答案 1 :(得分:1)
这是因为__callStatic()
仅在您的message()
方法存在而且非静态方法时才会触发不存在的方法。
E.g Log::foo('test');
不会触发此消息,因为没有这样的方法。
您正在检查__callStatic()
内存在的方法,而无意义:如果__callStatic()
被调用,则需要非现有方法。因此,条件总是虚假无用的。
这可能看起来很奇怪(因为您可能希望将静态方法称为非静态方法并在__callStatic()
内创建实例) - 但从可见性的角度来看,静态和非静态方法是相同的:因此,如果方法以static形式存在,它也将以非静态方式显示。