2011-07-17 29 views
6

,我只有幾個PHP訪問。看着神奇的get和set方法,我的(受Java影響的)肚子開始受到傷害:它看起來好像直接訪問屬性(儘管當然實際上是在使用__get和__set)。使用__get/__ set而不是傳統的getter/setter方法(少代碼除外)是否有優勢?來自Java的

因此 - 除了需要編寫的代碼更少之外,使用神奇的getter和setter方法而不是傳統的getX()/ setX()方法有什麼優勢?編碼PHP時我應該開始使用它們嗎?

謝謝,最好!

+2

有些時候我發現它很方便,但我會讓其他人回答其他原因。但我會指出,使用__get/__ set要慢得多...大約10倍。我不知道爲什麼,也沒有對自己進行基準測試,但它記錄在PHP的網站上。 – Brad

+2

請參閱http://programmers.stackexchange.com/questions/62383/what-is-the-point-of-properties以獲取更一般的「爲什麼屬性?」題。 – delnan

回答

1

__get____set__是完全動態的。因此,例如,如果調用啓用延遲加載的數據庫請求,就可以啓動數據庫請求。當然,你也可以通過getter和setter來做到這一點,但是每次你都必須這樣做。您也可以執行類似AOP的操作,因爲每個屬性調用都通過一種方法傳遞。因此,在所有__get__/__set__提供更多的靈活性,他們需要處理。你可以用它做很高級的/酷的東西。

1

的好處是,當你重構,直接分配/讀可以,而不需要立即改變完整的代碼庫也處理,代碼可能有點短,人們可以在一定程度更輕鬆地創建字符串(例如:$title="<title>{$obj->title}</title>";$title='<title>'.$obj->getTitle().'</title>';

然而,__get & __set方法可以變大而笨重相當迅速,並明確編碼正確&時,它是更好的我看來,使用顯式set/getX()方法做出明確函數被調用,和。代碼詳細程度的輕微增加就我所關心的而言是合理的,因爲人們可以很容易地看到實際上是什麼調用一個函數,什麼不是。一個可能的異常可能是當你爲另一個類/對象構建一個裝飾器時,但這就是它。

1

getter和setter方法和__set()__get()方法之間幾乎沒有區別!這些都是神奇的方法! __set()當你想將未定義的狀態賦值給一個對象時使用,所以__get()也可以用來獲取未定義狀態的值! setter和getter用於分配或獲取已定義狀態的值

2

__get()的唯一好處是代碼少的可能性,但即使如此也不一定如此。舉例來說,如果你有一組10名私有成員,你想吸氣透露5,你必須寫__get()因此,如果僞可見的成員之一被調用時,你把它。否則,你要麼發出錯誤(否則將自然而然沒有__get()或返回如null的值可能不是實際上是有幫助的。

我必須苛責任何人使用一般的getter和setter方法都誰提出,這通常指示與體系結構的問題解釋以下兩個代碼塊之間的概念上的差異,例如:

class _ { 
    public $_; 
} 

class _ { 
    private $_; 
    public function get_() { 
     return $this->_; 
    } 
} 

沒有一個各色NCE。

但是,許多人會指出擁有getter的優勢在於,它允許您以某種方式透明地修改返回值,以使其對收件人有用。但是,我們回到了架構問題。根本不應該因爲任何原因而暴露課程內容。相反,你應該告訴班級執行一個動作(根據其狀態可能會有所不同)。使用getter通常可以查詢班級的狀態,並根據所查看的狀態從外部執行操作。

我基本上會__set()和setter方法相同的參數,但有一個很好的事情,__set()讓你做:

class _ { 
    private $_ = array(); 
    public function __set($key, $val) { 
     $this->_[$key] = $val; 
    } 
} 

這使您可以鍵入非常好的$_obj->key = 'val'。請注意,這與其他方法沒有多大區別,並添加了另一種方法,例如add(),它取得了鍵和值並執行相同的操作,我只是更喜歡對象設置符號。

0

除了需要編寫的代碼少之外,使用神奇的getter和setter>方法而不是傳統的getX()/ setX()方法有什麼優勢嗎?編碼PHP時我應該開始使用它們嗎?

鑑於較少的代碼編寫它已經是一個強有力的理由開始使用它們。
的另一個原因是,你可以添加一個共同的行爲來所有的getter/setter

function __set() { 
    //> Do some code in common between all setter 

    //> set your var here 
} 
0

當寫的getX()/ setX的()爲每個屬性,實際地說,你必須在最低限度, 7行代碼。這是假設你的打開方法大括號與定義在同一行上,並且你只將一行代碼放入方法中,那麼你的大括號就在它自己的行上。

對於非平凡物體,乘以6(YMMV)。這是42行只是屬性訪問/突變。那不是包括輸入驗證或規範化。作爲替代方案,請查看:https://github.com/metaphp/attributes

0

動態編程中有開銷(例如使用魔術方法)。一個古老的風向標:Benchmarking magic

由於PHP是一種動態的(而不是完全企業)的語言,減少了代碼行和缺少一些納秒似乎好主意許多箱子(調試,可擴展性,減少錯誤和等)。

相關問題