2013-10-09 2 views
4

이 오류를 다루는 다른 질문을 찾았지만 내 문제에 해당하는 사례를 찾을 수 없습니다.

기본적으로 내 클래스의 정적 메서드는 정적이 아닌 메서드를 호출합니다.이 정적 메서드는 다른 비 정적 메서드를 호출합니다. $이 통해 다른 비 정적 클래스 메소드의 비 정적 클래스 메소드를 호출 괜찮없는 이유

Fatal error: Using $this when not in object context in class.php on line ...

내가 알아낼 수 없습니다 :

이것은 치명적인 오류가 발생합니다. 둘 다 정적 함수에서 호출되므로 $ 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(); 

답변

3
당신이 정적 비 정적 메서드 호출하기 때문에 오류가 발생

(이있을 것이다 여기

은 (간체) 클래스 E_STRICT 발생 - 오류보고 확인) 실행을 중지하지 않지만 개체 컨텍스트가 없음을 나타냅니다 ( $this 사용할 수 없음).

오류를 수정하는 적절한 방법은 activate()에 클래스를 인스턴스화하고 객체에 redis_query() 메서드를 호출하는 것입니다.

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

즉, redis_query()은 컨텍스트와 함께 실행되므로 정상적으로 작동합니다. 또한 activate() 메서드는 정적이므로 호출 코드에 새 객체를 만들 필요가 없습니다. 직접 Redis_Provision::activate()으로 전화하면됩니다.

+0

"정적이 아닌 메서드를 정적으로 호출했기 때문에"- activate()가 STATIC으로 정의 되었습니까 ??? –

+0

'self'를 사용하여'redis_query()'를 정적으로 호출하고 있습니다. –

+0

실제로 new를 사용하여 객체를 인스턴스화 했음에도 불구하고 정적 메서드를 호출하면 정적 컨텍스트에서 코드가 실행되어 오류가 발생합니다. – EmmanuelG

관련 문제