PHP中带static的非静态调用方法

PHP中带static的非静态调用方法,php,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_arra

我有如下代码:

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()

日志:测试


有人能帮我吗?

\u callStatic
只有在您的方法不存在的情况下才能工作。 将方法从“message”重命名为“messageStatic”,并更改
\u callStatic
方法:

 if (method_exists($object, $name.'Static')) {
    return call_user_func_array(array($object, $name.'Static'), $parameters);
}
这是因为只有不存在的方法才会被触发,而
message()
方法存在并且是非静态的

例如
Log::foo('test')不会触发此消息,因为没有此类方法

您正在检查
\uu callStatic()
中是否存在您的方法,这毫无意义:如果调用了
\uu callStatic()
,则是对不存在的方法的调用。因此,条件永远是虚假的和无用的


这似乎有些奇怪(因为您可能希望将静态方法称为非静态方法,并在
\u callStatic()
中创建实例)-但从可见性的角度来看,静态方法和非静态方法是相同的:因此,如果方法以静态形式存在,它也将以非静态形式存在。

如果您希望以您所做的方式调用
消息
,只需将
公共函数消息($message)
更改为
公共静态函数消息($message)
检查您的php版本;魔法方法
\uuu callStatic()
仅在5.3.0版本中提供注意:\uu callStatic在方法声明为受保护时也可以使用。
 if (method_exists($object, $name.'Static')) {
    return call_user_func_array(array($object, $name.'Static'), $parameters);
}