2013-03-05 3 views
0

이 내가 결과 성공적으로 삽입개인 변수에 어떻게 액세스 할 수 있습니까?

를 얻을이 코드를 실행하면 내 수업

abstract class DataStore_Adapter { 

    private $id; 

    abstract function update(); 
    abstract function insert(); 

    function __construct() { 
     $this-> id = 3; 
    } 
    function save() { 
     if(! is_null($this->id)) { 
      $this->update(); 
     } else { 
      $this->insert(); 
     } 
    } 
} 

class VS_DataStroe_Adapter extends DataStore_Adapter { 

    function __construct() { 
     parent:: save(); 
    } 
    function update() { 
     echo "successfully updated!"; 
    } 
    function insert() { 
     echo "successfully inserted!"; 
    } 
} 

$vs_data = new VS_DataStroe_Adapter(); 

입니다!

난 제거하면

$ this-> ID = 3;

DataStore_Adapter의 생성자 메소드로부터

과 저 결과 제공) ( 저장 함수 내에 배치;

성공적으로 업데이트되었습니다.

이 동작에 대한 설명이 필요합니다. private 변수로 $ id를 선언 했으므로 DataStore_Adapter 클래스를 통해서만 액세스 할 수 있습니다. 하지만 내가 save() 메소드 하위 클래스를 초기화하면 그 값에 액세스 할 수 있습니다. 어떻게 가능합니까? 그리고 왜?

+0

"하위 클래스는 그 값에 액세스 할 수 있습니다"라는 코드가 어디에 있습니까? 게시 한 코드에서 클래스 자체 만이 값에 액세스합니다. – DCoder

+0

클래스 자체 (예 :'DataStore_Adapter')만이 예제에서 private 변수에 액세스하고 있습니까? 멤버 함수 내에서 private 멤버 변수에 액세스 할 때 아무런 문제가 없습니다 ... – BenM

+0

ok, 위의 예제에서 id == null이 어떻게됩니까? 하위 클래스가이 부모 클래스에 액세스 할 때 DataStore_Adapter의 생성자가 호출 될 때마다 id가 null이 될 수 없을 때마다 생각했습니다. – guitarlass

답변

2

개인 속성은 선언 한 클래스의 범위에서만 액세스 할 수 있습니다. Save()는 부모 클래스 (ID 선언)에 정의되어 있으므로 액세스 할 수 있습니다.

즉, private DataStore_Adapter::$idDataStore_Adapter::save()에서 액세스 할 수 있습니다. 둘 다 동일한 클래스에 정의되어 있기 때문입니다. 상속을 통해 특성 또는 메서드를 공유하려는 경우 protected을 사용할 수 있습니다. 모두

0

:: 당신이 DataStore_Adapter의 저장() 메서드를 호출하는) (저장, 따라서 개인 속성 $ ID가) (저장 볼 수 있습니다 비공개 및 기타 키워드에 대한 정보 here.

0

당신은 자세한 내용을보실 수 있습니다 동일한 클래스에 속해 있기 때문에 당신이 부모를 호출 할 때