2013-06-20 32 views
4

這是一個非常具體的問題,我無法在任何地方找到答案。 這適用於很多語言,但我特別想在PHP中弄明白。 爲了這個,我將使用'events'作爲我們的課程。還有保持簡單分爲兩種類型:區分哪些參數屬於哪個對象

abstract class Event{ 
    protected $cost; 
    protected $startTime; 

    public function __construct(){ 
     foreach($eventData as $key => $val){ 
      if(property_exists($this, $key)){ 
       $this->$key = $val; 
      } 
     } 
    } 
} 

class Party extends Event{ 
    private $hasPointyHats; 

    public function __construct($eventData){ 
     parent::__construct($eventData); 
     $this->hasPointyHats = $eventData->hasPointyHats; 
    } 
} 

類的事件有2個道具:成本和開始時間。當它被構造時,它應該傳遞一個包含事件的所有參數的關聯數組,並且它會自動將該屬性設置爲傳遞的數組值。

班級派對通過確定這個事件是否會有那些真棒尖尖派對帽來擴展事件(如果沒有,我不會去)。

而且沒有。不,它不。因爲當你通過這個對象:

//Some result set... 
$mysqli_result = $result->fetch_assoc(); 

擁有成本,開始時間和hasPointyHats值(甚至可能更多!),你會得到以下誤差小:

Fatal error: Cannot access private property Party::$hasPointyHats in C:\somePath\Event.php on line 35 

我明白爲什麼。因爲在「事件」中,$這指的是「派對」對象,但它是私人的。 我不想覆蓋超級構造函數中對象的每個屬性,只是屬於超類(抽象類事件)本身的那些屬性。有沒有一種方法來定位Event類的特定屬性,而不是子類的特定屬性?這樣,不管我用什麼對象來擴展它,我都不會無意中在子類上設置屬性,因爲傳遞的對象有一些衝突的屬性?

我認爲這是一些愚蠢的事情,就像super-> property或其他東西,但我仍然需要使用property_exists。

感謝提前的幫助。

回答

2

您可以使用property_exists只是一個類名,而不是一個對象。 像這樣:

abstract class Event{ 
protected $cost; 
protected $startTime; 

public function __construct($eventData){ 
    foreach($eventData as $key => $val){ 
     if(property_exists(__CLASS__, $key)){ 
      $this->$key = $val; 
     } 
    } 
} 
} 
+0

歡迎來到Stack Overflow。我其實比我自己的回答更好。我想我沒有仔細檢查property_exists()文檔。 – jcsanyi

+0

我向你發誓,當我睡着的時候,昨晚凌晨1點45分,這個消息傳到了我的腦海裏。我甚至在DOC中閱讀它,並且出於任何原因,我正在推翻它。這絕對是答案** DUH **。謝謝!! – dudewad

1

property_exists(),隨着PHP 5.3的,它會檢查獨立的無障礙的屬性,這也解釋了你所看到的行爲存在的文件中明確規定。

get_object_vars(),而另一方面,獲取範圍已定義的屬性的列表,所以應爲您的目的更好地工作。

嘗試這樣:

public function __construct() { 
    $props = get_object_vars($this); 
    foreach ($eventData as $key => $val) { 
     if (array_key_exists($key, $props)) { 
      $this->$key = $val; 
     } 
    } 
} 

這不專門檢查它的父類的屬性,只是它的父類的訪問。

如果你真的想限制只是父類,get_class_vars()可能會更好:

public function __construct() { 
    $props = get_class_vars(__CLASS__); 
    foreach ($eventData as $key => $val) { 
     if (array_key_exists($key, $props)) { 
      $this->$key = $val; 
     } 
    } 
} 
相關問題