[請益] 關於魔術方法 __set __get

作者: nono5938 (玥乂)   2017-03-12 22:05:25
我最近算是剛學php
在class的部份有個小問題,
我們在設定private 或是protected的變量時,
我們可以用public function
自己設定一個內部函數
去修改這類型的變量,
還有另一種方法是直接利用標題所說的
魔術方法 __set __get
去改變或是查看這個變量
我想問的是大家在操作這類變量
是使用那一種方法比較多呢?
我是覺得魔術方法好像很好用,
但好像也有人說這方法不好?
說這方法不能對特定變量做一些限制。
若是設定一種新的變量就寫一個
新的public function就沒這個問題。
但我看網路上
有人在 __set裡面寫個switch
不能個別對變量作限制的缺點好像就没了
//之前沒打functuon name 現在加回去
public function __set($name,$value){
switch($name){
case "$name"
..........
break;
}
}
請問我有忽略什麼嗎?
哪一種方法比較好比較常用呢?
作者: wilson200106 (種子種子)   2017-03-13 00:58:00
你忽略了function name(X
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-03-13 10:43:00
你有學過其他語言經驗嗎
作者: nono5938 (玥乂)   2017-03-13 11:35:00
痾 c懂一點皮毛,所以用魔術方法真的會有什麼嚴重的問題嗎?
作者: GALINE (天真可愛CQD)   2017-03-13 12:30:00
魔術方法的好處是你連單純的 get/set 都能用程式控制例如你有複雜的白名單機制,或是你內部存資料的方式跟外部介面不一樣,或是你需要對於 set 進來的東西加料,然後不想寫同樣的東西寫個五十次之類的有這種需求的話,就用吧。反過來就是沒這種需求就少用當然拿來實驗或把玩是沒問題的這東西有兩個缺點:code 可以變得很難 trace(看你怎麼寫然後有效能 overhead。當然大部分情況那個 overhead 還好但是有個很多人在用的東西被 magic function 搞到肥慢慢該死的 laravel...
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-03-13 12:34:00
一般物件導向語言教材都會先教getProp()/setProp()你有幾個prop就寫幾組一般也建議先習慣這樣 再用get/set這種動態語言的作法在初學階段最好不要急著想怎麼節省程式碼篇幅
作者: GALINE (天真可愛CQD)   2017-03-13 18:58:00
我倒覺得初學試一下也不算壞事,試一下「喔喔喔喔好強」然後兩個月後「靠北這段 code 到底在跑三小」也是種體驗而且悟性好的人搞不好就摸出順眼的用法了只要不像是 laravel 一樣什麼都要過一次 magic 然後速度也讓人感覺很 magic....(對我就是吃 slim 這一套 =v=)
作者: nono5938 (玥乂)   2017-03-13 21:26:00
trace好像確實是個問題,但效能overhead是?不太明白怎麼會overhead有個什麼例子嗎?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-03-14 09:46:00
進去method裏面再switch 跟要改哪個prop就叫哪個method用聞的也知道是前面overhead比較多當然現在php改良很多 是可以試一試
作者: GALINE (天真可愛CQD)   2017-03-14 11:19:00
https://goo.gl/kljGuw 範例。裡面的數字是 PHP7,PHP5 會再慢個幾倍。基本上是個平常用兩下沒問題,但是被放到大迴圈裡面會有感覺的程度PHP裡面New物件跟call function跟magic function都是相對昂貴的存在,比較過分的就像Laravel的ORM,對上千個物件做操作就明顯感到慢,我對這個怨氣很重 :/當然能升級PHP7的話,升級可以解決很~多效能問題。但是實際工作很容易看到升不上7的code,還是得注意
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-03-14 13:07:00
最近看到的例子以5.3為主 老到5.1都有 X(
作者: nono5938 (玥乂)   2017-03-14 14:06:00
好吧 多個switch好像是真的會影響到處理的進程,我大概瞭解優缺點了謝謝大家
作者: GALINE (天真可愛CQD)   2017-03-14 14:07:00
這麼慘,那有機會碰到十倍效能差距...我是覺得還是可以玩看看,畢竟用的好的時候可以做出超漂亮的介面...
作者: tkdmaf (皮皮快跑)   2017-03-16 02:32:00
額外小提醒,在台灣請使用「變數」而不是「變量」這詞。
作者: nono5938 (玥乂)   2017-03-16 13:19:00
有點被同化了 我是在youtube看一個大陸的影片學的QQ
作者: JohnRoyer (Zero 日落)   2017-03-22 20:29:00
Laravel 裡面用的 reflection 應該也拖了不少速度吧?
作者: GALINE (天真可愛CQD)   2017-03-24 11:05:00
Laravel 裡面做的能拖慢速度的黑魔法可多了...量很大才會痛就是了,一天一兩千人的程度不太有感覺我是背景要處理大量資料的工作用了Elquent ORM...好慢....

Links booklink

Contact Us: admin [ a t ] ucptt.com