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);
}