2011-04-08 7 views
5

PHP에서 객체 지향에 대해이 단락에 대해 약간 혼란 스럽습니다. 누군가 나에게 설명 할 수 있는지 궁금했다. 예는 대단 할 것입니다! 내 두뇌는 분명히 생각하지 않습니다.PHP 객체 지향 가시성

http://www.php.net/manual/en/language.oop5.visibility.php

첫번째 단락

속성 또는 방법 의 가시성 공공 키워드와 선언, 또는 개인 보호 붙임에 의해 정의 될 수 읽는다. 반원 인 은 누구나 에 접속할 수 있습니다. 보호 된 으로 선언 된 멤버는 클래스 내에서 그리고 상속 된 클래스 부모 인 클래스에서만 액세스 할 수 있습니다. 전용 으로 선언 된 멤버는 이 멤버를 정의하는 클래스에서만 액세스 할 수 있습니다.

어떻게 하위 클래스 멤버에 액세스 할 수 있습니까?

class A { 
    public function test() { 
     $b = new B; 
     echo $b->foo; 
    } 
} 

class B extends A { 
    protected $foo = 'bar'; 
} 

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

답변

5

. 속성은 컴파일 단계가 아니라 런타임에 해석됩니다. 그리고 액세스 한정자는 속성에 액세스 할 때 확인됩니다.

새 (선언되지 않은) 속성을 임시로 삽입하여 공개되거나 상속 된 클래스에서 보호 된 속성을 선언하는 경우에는 아무런 차이가 없습니다.

private은 실제로 외부로부터의 액세스 가능성에만 영향을 미칩니다. ->name은 런타임에 상관없이 작동합니다. 그리고 PHP 런타임은 속성 선언이 현재 객체 인스턴스 클래스에 대해 만들어진 경우 단순히 prope하지 않습니다. (개인 선언과 달리)

+1

너무 잘못 보입니다. PHP가 추악한 막대기로 항상 그려지는 것은 당연합니다 ;-) – Phil

+0

@Phil 예,이 패턴이 권장되는지 아닌지는 다른 이야기입니다 ... ;-) – deceze

+0

이것은 최고입니다 !! haha – Sufendy

1

PHP는 해석 언어입니다 : 방법

1

공용 범위 : 속성 (메서드, 변수 등)은 모든 파일의 모든 클래스에서 액세스 할 수 있습니다.

class Example { 
    public $foo; 
} 

$example = new Example; 
$example->foo = 3; // everything OK 

개인 범위 : 속성에만 같은 클래스에 의해서만 액세스 할 수 있습니다.

class Example { 
    private $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // raises error 
    } 
} 

보호 범위 : 속성은 동일한 클래스 또는 다른 클래스에서 액세스 할 수 있습니다.

class Example { 
    protected $foo; 
} 

class Child_Class extends Example { 

    public function some_method() 
    { 
     parent::foo = 3; // this is OK 
    } 
} 

모두 캡슐화라는 기술과 관련이 있습니다. 클래스 외부에서 클래스 멤버의 상태 또는 동작을 변경하면 안됩니다. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)