2012-03-25 87 views
0

問題很簡單。我有一個基本的抽象類(人)。從這我擴大了另一類(患者)。php阻止父母訪問兒童屬性

我在PERSONS表中保存個人信息(例如名字,姓氏)[有ADD函數。 ]。患者特定信息(如疾病,藥品等)被保存到單獨的患者類別中。 [有一個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',那麼父類將無法看到它們。 – 2012-03-25 15:35:31

+0

在這種情況下,是否有無論如何我都可以使用'person'對象只有沒有孩子提供的添加劑? – 2012-03-25 15:38:15

+0

您需要發佈更多的代碼,以便我們可以看到您的類實現。子類不會將任何添加的東西傳遞給父類, d如果父項是'abstract',則它不能被自身實例化。 – 2012-03-25 15:41:51

回答

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

謝謝。我正在爲此工作。 – 2012-03-25 16:42:47

+0

你能詳細說一下,我應該在哪裏放?父抽象類中的函數? – 2012-03-25 18:05:53

+0

我已經更新了我的答案中的代碼! – Niko 2012-03-25 18:14:53