错误:不在对象上下文中时使用$ this

时间:2013-10-09 00:58:21

标签: php class methods static-methods

我已经查找了其他有关此错误的问题,但找不到适用于我的问题的案例。

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

这会引发致命错误:

  

致命错误:当不在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();

1 个答案:

答案 0 :(得分:3)

发生错误的原因是您静态调用了非静态方法(这将会增加E_STRICT - 检查错误报告),这不会停止执行,但意味着没有对象上下文({{ 1}}无法使用。)

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

redis_query()

这意味着$redis_provision = new Redis_Provision(); if($redis_provision->redis_query()->ping()) { ... } 使用上下文执行,因此正常运行。

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