4

我已经寻找涵盖此错误的其他问题,但找不到适用于我的问题的案例。

基本上,我的类中的静态方法调用了一个非静态方法,该方法反过来又调用了另一个非静态方法。

这会引发致命错误:

致命错误:在线上的 class.php 中不在对象上下文中时使用 $this ...

我不明白为什么不能通过 $this 从另一个非静态类方法调用非静态类方法。是不是因为它们都是从静态函数调用的,因此没有 $this 实例?

这是(简化的)类:

class Redis_Provision {

    public $redis = NULL;

    public function redis_query()
    {
        if(is_null($this->redis)) {
            $this->setBackend();   <------- This throws the fatal error
        }
        return $this->redis;
    }

    public function setBackend()
    {
        $this->redis = new Redis();
        $this->redis->connect();
    }

    public static function activate()
    {

        if( self::redis_query()->ping())
        {
            // Do stuff
        }
    }
}

我会通过以下方式调用:

$redis_provision = new Redis_Provision();
$redis_provision->activate();
4

1 回答 1

3

发生错误是因为您静态调用了一个非静态方法(这会引起E_STRICT- 检查您的错误报告),这不会停止执行,但意味着没有对象上下文($this不能使用)。

修复错误的正确方法是在 中实例化类activate(),并在对象上调用redis_query()方法,例如

$redis_provision = new Redis_Provision();
if($redis_provision->redis_query()->ping()) { ... }

这意味着它redis_query()在上下文中执行,因此正常运行。

此外,该activate()方法是静态的,因此您无需在调用代码中创建新对象。你可以直接打电话Redis_Provision::activate()

于 2013-10-09T01:08:51.350 回答