在PHP中使用static调用非静态方法

时间:2014-04-08 11:47:46

标签: php

我的代码看起来像这样:

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()不应该静态调用...

记录:测试。

有人可以帮帮我吗?

2 个答案:

答案 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形式存在,它也将以非静态方式显示。