我的代码如下所示:
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()不应静态调用...
日志:测试。
有人能帮帮我吗?
发布于 2014-04-08 19:51:39
只有当您的方法不存在时,__callStatic才会起作用。将您的方法从"message“重命名为"messageStatic”,并更改__callStatic方法:
if (method_exists($object, $name.'Static')) {
return call_user_func_array(array($object, $name.'Static'), $parameters);
}发布于 2014-04-08 19:52:01
这是因为当您的message()方法存在并且是非静态的时候,__callStatic()将只对不存在的方法触发。
例如,Log::foo('test');不会触发此消息,因为没有这样的方法。
您正在检查__callStatic()内部是否存在您的方法,这是没有意义的:如果调用了__callStatic(),则它是对不存在的方法的调用。因此,条件永远是假的和无用的。
这可能看起来很奇怪(因为您可能希望将静态方法称为非静态方法并在__callStatic()中创建实例)-但从可见性的角度来看,静态方法和非静态方法是相同的:因此,如果方法作为静态方法存在,那么它也将作为非静态方法可见。
https://stackoverflow.com/questions/22936085
复制相似问题