2010-04-23 31 views
31

魔術方法PHP中的最佳實踐?魔術方法PHP中的最佳實踐?

+1

「最佳實踐」是什麼意思?你的問題對我來說並不合適。他們是工具,有些事情離不開他們。你想知道什麼? – 2010-04-23 10:56:57

+0

我正在讀一本書n OOP我遇到了吸氣和安裝員,在那裏我看到了神奇的方法術語..但是一旦有人告訴我他們已被棄用,是這樣嗎? – 2010-04-23 10:58:28

+2

我的猜測是要麼他認爲他們是偷偷摸摸/作弊(像'我++'和'goto',或者他擔心他們被過度使用或不可靠,你知道,就像使用表格造型 – Anthony 2010-04-23 10:59:52

回答

21

我不認爲神奇的方法是最好的或最壞的做法:取決於你想達到什麼你可以使用它們或不... 我的意思是,你不必調整你的代碼儘可能使用它們,但是如果你必須這樣做,那完全沒有問題。

如果你有一個擁有3個屬性但只有3個屬性的對象,你不需要使用魔術設置器/獲取器,但是在某些高級的情況下,它們是一個很好的方法來完成非常複雜的事情(ORM系統等)

也許其中一些已被棄用,我不知道,但大多數都不是。

3

我不這麼認爲。我的IDE無法向魔術設置者和獲取者顯示「提示」。儘管代碼有時難以調試。

我更喜歡不使用它們,bette通過我的IDE生成所需的方法(像許多setters和getters)。

+2

這可能適用於getter和setter,但不是'__construct','__clone'等也被認爲是「神奇的方法」?http://php.net/manu al/en/language.oop5.magic.php沒有他們的人會如何工作? – 2010-04-23 11:02:53

+0

正確同意@Potter i平均@Pekka :) – 2010-04-23 11:06:28

6

至少,其中的一些神奇的功能,建議由谷歌:

避免寫天真getter和setter方法

當PHP編寫的類,可以節省時間和加快您的 通過直接使用對象屬性而不是 編寫簡單的制定者和獲得者。在以下示例中,狗 類使用setName()和getName()方法來訪問名稱 屬性。

class dog { 
    public $name = ''; 

    public function setName($name) { 
    $this->name = $name; 
    } 

    public function getName() { 
    return $this->name; 
    } 
} 

注意的setName()輸出,getName()什麼都不做比商店越來越 分別返回name屬性。

$rover = new dog(); 
$rover->setName('rover'); 
echo $rover->getName(); 

設置和調用name屬性直接可以運行 up to 100% faster,以及削減開發時間。

$rover = new dog(); 
$rover->name = 'rover'; 
echo $rover->name; 

原文鏈接:http://code.google.com/speed/articles/optimizing-php.html

存檔版本:https://web.archive.org/web/20120208060457/http://code.google.com/speed/articles/optimizing-php.html

無論如何,這些方法可能不是高性能,但他們不會被棄用的。

+2

在這裏,另一種意見:http://www.garfieldtech.com/sites/default/files/benchmarks.png:D (請參閱http://www.garfieldtech .com/blog/magic-benchmarks) – Rolf 2010-04-23 12:01:30

+1

這個答案完全是題外話。 「Google」並不反對使用本地getter/setter與魔術功能。他們建議不要使用本地getter/setter,如果他們只是直接修改屬性。這不是一回事。 – 2013-08-26 10:28:08

+0

他們反對使用「天真」的getter/setter。當時最初問題的流行答案(3年前,btw,這裏是我給你的:http://xkcd.com/386/)建議不要使用魔術方法。我的回答只是指出,這不一定是絕對的事實。 – Rolf 2013-08-27 09:05:49

39

利弊

  1. 文本搜索沒有找到該功能

  2. 系統是很難理解,尤其是對於新手

  3. 重構工具威力更經常失敗

一般來說,魔術方法做事情的幕後程序員可能沒有意識到它的發生,這使得調試困難。

當搜索功能(或其他符號)找不到所有匹配時,它將成爲一個噩夢來刪除舊代碼,這種恐懼會導致死代碼堆積在代碼庫中。如果移除了死碼,它可能會導致未知地方發生破損。