首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用静态调用非静态方法

问在PHP中使用静态调用非静态方法
EN

Stack Overflow用户
提问于 2014-04-08 19:47:46
回答 2查看 320关注 0票数 1

我的代码如下所示:

代码语言:javascript
复制
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>';
    }
}

现在,我调用:

代码语言:javascript
复制
Log::message('test');

结果如下:

严格的标准:非静态方法Log::message()不应静态调用...

日志:测试。

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2014-04-08 19:51:39

只有当您的方法不存在时,__callStatic才会起作用。将您的方法从"message“重命名为"messageStatic”,并更改__callStatic方法:

代码语言:javascript
复制
 if (method_exists($object, $name.'Static')) {
    return call_user_func_array(array($object, $name.'Static'), $parameters);
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-08 19:52:01

这是因为当您的message()方法存在并且是非静态的时候,__callStatic()将只对不存在的方法触发。

例如,Log::foo('test');不会触发此消息,因为没有这样的方法。

您正在检查__callStatic()内部是否存在您的方法,这是没有意义的:如果调用了__callStatic(),则它是对不存在的方法的调用。因此,条件永远是假的和无用的。

这可能看起来很奇怪(因为您可能希望将静态方法称为非静态方法并在__callStatic()中创建实例)-但从可见性的角度来看,静态方法和非静态方法是相同的:因此,如果方法作为静态方法存在,那么它也将作为非静态方法可见。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22936085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档