2012-02-24 17 views
1

作爲一種良好做法,我的所有重載的__get函數是否應該看起來像http://us3.php.net/manual/en/language.oop5.overloading.php#object.isset中的這個示例,並且包含調試代碼?PHP __get超負荷代碼良好做法

public function __get($name) 
{ 
    echo "Getting '$name'\n"; 
    if (array_key_exists($name, $this->data)) { 
     return $this->data[$name]; 
    } 

    /*question specific code from here on*/ 

    $trace = debug_backtrace(); 
    trigger_error(
     'Undefined property via __get(): ' . $name . 
     ' in ' . $trace[0]['file'] . 
     ' on line ' . $trace[0]['line'], 
     E_USER_NOTICE); 
    return null; 
} 

它似乎可能最終成爲大量重複的代碼,如果包括在我重載的每個類中。

+0

你有沒有想過繼承或靜態輔助類? – rcdmk 2012-02-24 01:45:39

回答

0

我會拋出一個異常,而不是做一個debug_backtrace()trigger_error()

雖然是情景。如果密鑰不存在,您可能希望完全做其他事情。

0

這種情況下沒有「良好做法」。

根據對象預期的行爲(這取決於任務,僅此而已)你:

  1. 觸發通知/警告(如你的例子)
  2. 拋出一個異常
  3. 返回null(或一些其他預定義值)
0

不。本示例使用什麼是成員變量並將它們存儲在數組成員變量中。你不應該在任何地方超載。你應該把它放在父類中並讓它繼承。

另外,觸發錯誤的輸出是老派。創建一個新的異常類並拋出它,例如PropertyNotFoundException。

0

你可以將任何異常處理包裝在一個全局實用程序函數中,該函數有點DRYer。您還可以使用AOP庫在現有類中注入此功能。

1

不可以。您的重載__get函數根本不需要像這個例子。

恕我直言,這是一個不錯的主意,以避免這些神奇的功能。它們看起來很有吸引力,但使用這種「魔術」會導致難以維護的代碼。至少,這是我的經驗。

我今天「遵循」的「原則」之一就是擁有「IDE友好」類。我的意思是:如果我使用Eclipse PDT,並且$variable是給定類的,則自動完成應該向我顯示所有可用的方法和屬性。使用這些神奇的方法,我們永遠無法告訴可用的東西。

這只是一般性建議,可能不適用於您的具體情況。