2010-11-25 2 views
10

저는 최근에 일부 클래스 파일에서 작업하고 있으며 멤버 변수가 protected static $ _someVar와 같은 protected 정적 모드로 설정되어 static :: $ _ someVar와 같이 액세스되었음을 확인했습니다.보호 된 정적 멤버 변수

나는 가시성의 개념을 이해하고 무언가를 protected static으로 설정하면 멤버 변수가 수퍼 클래스 또는 파생 클래스에서만 액세스 될 수 있지만 정적 메서드에서만 보호 된 정적 변수에 액세스 할 수 있습니까?

감사합니다.

답변

33

제가 올바르게 이해한다면, 당신이 말하는 것은 late-static bindings입니다. 이있는 경우 :

class A { 
    static protected $_foo = 'bar'; 

    static public function test() { 
     echo self::$_foo; 
    } 
} 

class B extends A { 
    static protected $_foo = 'baz'; 
} 

B::test(); // outputs 'bar' 

당신은 변경하면 self 비트 :

echo static::$_foo; 
다음

수행

B::test(); // outputs 'baz' 

self$_foo이 정의 된 클래스 (A)을 의미하기 때문에 static은 런타임에이를 호출 한 클래스를 참조합니다 (B).

물론 가시성과 범위는 여전히 중요하지만 정적 메소드 (즉, 객체 컨텍스트) 외부에서 정적으로 보호 된 멤버에 액세스 할 수 있습니다.

+2

이 예제에서는 클래스 B가 "클래스 B가 확장되어야합니다"라고 생각합니다. –

+0

@Nathan : 호 (몇 주 후). 결정된. 감사! – netcoder

6

정적 변수는 클래스의 인스턴스가 아니라 클래스에 있습니다.

self::$_someVar 

self 오히려 현재 인스턴스 (같은이 $this)보다는, 현재의 클래스에 대한 참조 점이다 작동하는 이유 : 당신처럼 뭔가를 호출 비 정적 메서드에서 액세스 할 수 있습니다. 데모로서

:

<? 
class A { 
    protected static $foo = "bar"; 

    public function bar() { 
    echo self::$foo; 
    } 
} 

class B extends A { } 

$a = new A(); 
$a->bar(); 

$b = new B(); 
$b->bar(); 
?> 

출력 barbar입니다. 그러나 직접 액세스하려고하는 경우 :

echo A::$foo; 

그러면 PHP가 보호 대상에 액세스하려고 시도 할 때 사용자에게 불만을 표시합니다.

+0

그래, 왜 정적보다 자기를 사용하겠습니까? 예 : self :: $ foo 또는 static :: $ foo –

+0

클래스 외부에서 시도 할 때 예,하지만 클래스 메서드 내에서 액세스하려고 할 때에 대해 이야기하고 있습니다. –

+0

A-> foo()를 정의하고'self :: $ foo'를 호출하면 A에 정의 된 정적 $ foo를 반환합니다. A를 B의 일부로 하위 클래스화한 경우 상속 된 foo (), A에서 $ foo를 사용합니다. B에서 정의한 경우에도 사용합니다. static :: $ foo를 사용하면 B에 정의 된 $ foo를 사용하게됩니다. –