2013-04-15 5 views
0

왜이는 "엄격한 기준"통보? 나는 법적으로 부모 클래스의 비 정적 메서드 호출을 포함하는 정적 메소드를 호출하고PHP 범위 결정 연산자

'Strict Standards: Non-static method main::i() should not be called statically in...' 


class main 
{ 
    public function __construct() 
    { 
     echo "in main class"; 
    } 
    public function i() 
    { 
     echo "i in main"; 
    } 
} 

class secondary extends main 
{ 
    public static function tom() 
    { 
     parent::i(); 
    } 
} 

secondary::tom(); 

를 반환 않습니다.

+0

하지만'난() '정적 함수가 아니다. – Raptor

+0

나는 secondary :: tom()을 호출한다. 이것은 정적이다. –

답변

3

정적 메서드 내에서 비 ​​정적 메서드를 호출하면 안된다는 경고가 표시됩니다.

i() 메서드를 확인할 수 있습니다. 해당 메서드에 $this이 표시되지 않으면 i()을 정적 메서드로 변경할 것을 고려할 수 있습니다.

0

당신은 이미 tom()을 정적으로 (괜찮은) 호출하는 동안 자신에게 질문에 이미 대답했습니다. i()은 정적이 아닙니다.

정적이 아니므로 i()은 개체의 인스턴스가 있다고 가정하므로 인스턴스에 필요한 속성을 액세스하거나 다른 작업을 수행하려고 할 수 있습니다. 따라서 자식 클래스의 정적 메서드 내에서도 정적으로 호출하면 안됩니다. 당신의 코드에 약간의 변화 다음과 같은 예를 들어 고려 :

class main 
{ 
    var something = 0; 
    public function __construct() 
    { 
     echo "in main class"; 
    } 
    public function i() 
    { 
     $this->something++; 
     echo "i in main"; 
    } 
} 

class secondary extends main 
{ 
    public static function tom() 
    { 
     parent::i(); 
    } 
} 

secondary::tom(); 

그것은 엄격한 경고 - 당신은 당신이 원하는 경우 그것을 무시하도록 선택할 수 있습니다 의미 -하지만 당신이하고있는 것은 일반적으로 좋은 방법이 아닙니다 있음을 알리는 것 아마 당신의 접근 방식을 재고해야합니다.

public static function tom() 
    { 
     $this->i(); 
    } 

반환됩니다

0
class main 
{ 
    public function __construct() 
    { 
     echo "in main class"; 
    } 
    public static function i() 
    { 
     echo "i in main"; 
    } 
} 

class secondary extends main 
{ 
    public static function tom() 
    { 
     parent::i(); 
    } 
} 

secondary::tom(); 

는, 같이 내가 법적으로 parent::i();

에 의해 호출하지만 수행 할 수있는, 정적으로 기능 i();를 변환 한주의해야 무엇인가 :

Fatal error: Using $this when not in object context

그럼 내기를 완전히하는 것입니다. 정적이거나 정적이 아닙니다.

해상도 :

class main 
{ 
    public function __construct() 
    { 
     echo "in main class"; 
    } 
    public function i() 
    { 
     echo "i in main"; 
    } 
} 

class secondary extends main 
{ 
    public function tom() 
    { 
     $this->i(); 
    } 
} 

$Class = new secondary(); 
$Class->tom();