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 に答える