2012-03-25 2 views
0

질문이 간단합니다. 나는 기본 추상 클래스 (person)를 가지고있다. 이것에서 나는 다른 종류 (환자)를 확장했다.PHP가 부모가 하위 속성에 액세스하지 못하도록합니다.

PERSONS 테이블에 개인 정보 (예 : 성, 성)를 저장합니다. [추가 기능이 있습니다. ]. 환자 특정 정보 (예 : 병, 의약품 등)는 별도의 환자 클래스에 저장됩니다. [부모를 호출하는 ADD 함수가 있고 일부 코드가 있습니다].

사람의 추가 기능이 자녀, 환자 내부에 정의 된 속성에 액세스하는 것을 어떻게 방지합니까? 내가 추가 호출 할 때

class P { 
public P_var = 'Anoush' ; 
public function add() 
{ 
    // find all properties: 
    foreach ($this as $prop => $val) 
    { 
    $insertables [$prop] = $val ; 
    } 
    // insert all VALUES FIELDSET etc. based on the array created above 

} 

class CH extends P { 
public CH_var1 = 'ravan' ; 
public CH_var2 = 'something' ; 
} 

는 다음, $insertables이 P_var, CH_var1, CH_var2가 포함됩니다

더 명확하게하기 위해서, 여기에 샘플 코드입니다. P_var 만 갖고 싶을뿐입니다.

감사

+0

'patient' 속성이'public'이 아닌 경우, 부모 클래스는 그들을 볼 수 없습니다. –

+0

이 상황에서 어쨌든'person' 객체를 사용할 수 있습니까? 자식이 제공 한 첨가물이없는 경우에만 –

+0

클래스 구현을 볼 수 있도록 더 많은 코드를 게시해야합니다. 하위 클래스는 부모에게 다시 추가 된 것을 전달하지 않습니다. d 부모가'abstract' 인 경우 자체를 인스턴스화 할 수 없습니다. –

답변

1

당신은 (http://www.php.net/manual/en/book.reflection.php 참조) 반사를 사용하여이 작업을 수행 할 수 있습니다.

class Parent { 
    public function add() { 
     $insertables = $this->_getOwnProperties(__CLASS__); 
     // ... 
    } 

    protected function _getOwnProperties($className) { 
     $reflection = new ReflectionClass($this); 
     $props = array(); 

     foreach ($reflection->getProperties() as $name => $prop) { 
      if ($prop->class == $className) { 
       $props[$name] = $prop; 
      } 
     } 

     return $props; 
    } 
} 

그러나, 나는 (예를 들면 방법 getProperties() (아마도 인터페이스에 의해 정의) 또는 무엇이든을 추가 청소기 솔루션을 얻을 대신 코드를 리팩토링하는 것이 좋습니다. 그런 다음 데이터베이스 클래스 목록을 얻기 위해이 함수를 호출 할 수

+0

고맙습니다. 나는이 일을하고있다. –

+0

당신은 정교하게 말할 수 있습니까? 부모 추상 클래스 내부의 함수? –

+0

답변에있는 코드를 업데이트했습니다! – Niko

관련 문제