2012-05-24 3 views
4

내가 공부하고 PHP, OOP와 나는이 php.net/static에서 정적, 에서 나는 내가이 문장을 이해 didnt는PHP, OOP, 정적

Calling non-static methods statically generates an E_STRICT level warning. 

나는 단지 (안 속성에 대한) 방법으로 유효한의 이해 않았다 위의 문장은 입니다.하지만 이해하기에 성공하지 못했습니다. 실제로, 위 문장을 설명하는 코드를 제게 보여 주시면 기뻐요. 즐거운 한 주를 기원합니다.

+1

초기화하지 않고 비 정적 메서드를 호출하면 나는 E_STRICT 경고를 준다는 것을 알려줍니다. 정확히 이해가 안되니? Static은 클래스를 객체로 초기화하지 않고 메서드를 호출 할 수 있음을 의미합니다. –

+1

OOP 및 정적 호출에 대해 알아야 할 가장 중요한 사항은 혼합되지 않는다는 것입니다. 정적 호출은 절차 적 프로그래밍 사고 방식의 일부입니다. –

+0

답장을 보내 주셔서 감사합니다. – Blanktext

답변

4
class Foo 
{ 
    public static $my_static = 'foo'; 
    public $my_non_static = 'bar'; 

    public function staticValue() { 
     return self::$my_static; 
    } 

    public function nonStaticValue() { 
     return self::$my_non_static; 
    } 
} 

print Foo::$my_static . "\n"; // OK 
print Foo::staticValue(). "\n"; // E_STRICT 

print Foo::$my_non_static . "\n"; // Fatal 
print Foo::nonStaticValue(). "\n"; // Fatal 

print Foo::$my_static . "\n";은 정적으로 액세스됩니다.

print Foo::staticValue(). "\n";에 E_STRICT가 제공됩니다. 정적이 아닌 메소드는 정적으로 액세스되지만, 정적이 아닌 속성에는 액세스하지 않기 때문에 치명적 오류는 발생하지 않습니다.

정적이 아닌 필드에 정적으로 액세스 할 수 없기 때문에 다른 두 가지 치명적 오류가 발생합니다.

+0

비 정적 필드를 말할 때 값이 정적 필드 내부의 정적 값으로 정의되지 않는다는 것을 의미합니까? 그리고 E_STRICT에 대해서 그것은 단지 정적 인 접근을 할 수있는 것이 아니기 때문에 간단한 문자열을 반환 할 수 있습니다. 나는 스스로를 가질 필요가 없습니다 : $ x_static_prop. – Blanktext

+0

비 정적 필드 란 정적 키워드없이 정의 된 속성을 말합니다. 죄송합니다, 두 번째 문장을 이해하지 못합니다. – Ruben

+0

감사합니다. Ruben, 지금 당신을 이해합니다. 그리고 두 번째 문장에 관해서는 제가 'Hellow'를 돌려 줄 수 있다는 것을 의미했습니다. self :: $ static_prop가 아닙니다. – Blanktext

4

다음은 사용자가 묻는 문장의 의미를 보여주는 예입니다.

하나의 방법으로 다음 클래스를 생각해보십시오 (정적이 아닙니다).

class Test 
{ 
    function method() 
    { 
     echo "Hello from method"; 
    } 
} 

Test::method(); // attempt to statically call a non-static method 

출력이다

엄격한 기준 : 비 정적 법 시험 방법 :() 헬로
라인 (12) 상에 정적이라고 /obj.php 안된다 당신이 볼 수 있듯이 정적 심지어 네가 전화했을 때 방법

에서, 그것은 방법을 실행했다 정적 인 방법은 아니지만 엄격한 오류 메시지가 표시됩니다.

메서드 method()$this 키워드를 참조하면 $this이 정적 메서드 호출의 컨텍스트에 존재하지 않으므로 치명적인 오류가 발생합니다. 정적이 아닌 클래스 메서드를 정적으로 호출하는 것은 기술적으로 가능하지만 그렇게해서는 안됩니다.

편집 :

정적 클래스를 설계했다, 그래서 만약 static 키워드는 클래스 메소드의 맥락에서 PHP4에 존재하지 않았기 때문에 당신도 정적 비 정적 클래스 멤버 호출을 허용하는 이유는 나 메소드를 PHP4에서 보여줄 때, 그것을 나타 내기위한 키워드가 없었기 때문에 단순히 정적 인 방식으로 호출 할 것입니다. 메소드가 정적으로 호출되었지만 선언에 static 키워드가없는 경우 PHP5가 경고를 내 보냅니다.

+0

당신의 설명을 읽어 주셔서 감사합니다 정말 좋은 사람. – Blanktext

0

메소드가 정적이지 않은 경우 메소드가 클래스의 인스턴스에 속함을 의미합니다. 예를 들어, 우리가 getDamage() (차가 얼마나 손상되었는지를 계산하는)이라는 메서드를 가진 Car 클래스가 있다면,이 메소드를 정적 인 방법으로 호출하면 안됩니다.

Car 클래스의 인스턴스 만 만들고이 인스턴스에 getDamage()을 호출해야합니다. 특정 자동차가 25 % 손상 될 수 있고 또 다른 자동차가 70 % 손상 될 수 있기 때문에 이는 의미가 있습니다.

정적 방법으로 getDamage()을 호출하는 것은 의미가 없습니다. 정적 메서드는 클래스의 특정 인스턴스가 아니라 클래스 자체에 속합니다. 그리고 Car 클래스에는 getDamage()에 대한 결과를 제공하는 유용한 방법이 없습니다. 값 (아마도 0)을 계산할 수는 있지만 이해가되지 않습니다.

+0

설명해 주셔서 감사합니다. 매우 좋습니다. 논리적 인 것. – Blanktext

2

정적이 아닌 메서드를 정적으로 호출 할 수 있더라도 그렇게해서는 안되며 기록되지 않습니다.

class Foo { 
    function bar(){ 
     print "you should not do that"; 
    } 
} 

Foo::bar();는 실제로 작동하는 것입니다,하지만 당신 그렇게 때문에 당신은 E_STRICT 경고를 얻을 것이다, 그러나 당신 shouln't.

+0

고맙습니다. 마지막 라인 감사합니다. – Blanktext