顯示廣告
隱藏 ✕
※ 本文為 terievv 轉寄自 ptt.cc 更新時間: 2017-03-16 17:23:05
看板 PHP
作者 nono5938 (玥乂)
標題 [請益] 關於魔術方法 __set __get
時間 Sun Mar 12 22:05:25 2017



我最近算是剛學php

在class的部份有個小問題,
我們在設定private 或是protected的變量時,

我們可以用public function
自己設定一個內部函數
去修改這類型的變量,

還有另一種方法是直接利用標題所說的
魔術方法 __set __get
去改變或是查看這個變量

我想問的是大家在操作這類變量
是使用那一種方法比較多呢?

我是覺得魔術方法好像很好用,
但好像也有人說這方法不好?
說這方法不能對特定變量做一些限制。

若是設定一種新的變量就寫一個
新的public function就沒這個問題。

但我看網路上
有人在 __set裡面寫個switch
不能個別對變量作限制的缺點好像就没了


//之前沒打functuon name 現在加回去
public function __set($name,$value){
     switch($name){
          case "$name"
               ..........
          break;
     }
}


請問我有忽略什麼嗎?
哪一種方法比較好比較常用呢?

-----
Sent from JPTT on my Xiaomi MI 5.

--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.168.131
※ 文章代碼(AID): #1OnLMdIf (PHP)
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1489327527.A.4A9.html
wilson200106: 你忽略了function name(X1F 03/13 00:58
MOONRAKER: 你有學過其他語言經驗嗎2F 03/13 10:43
nono5938: 痾 c懂一點皮毛,所以用魔術方法真的會有什麼嚴重的問題3F 03/13 11:35
nono5938: 嗎?
※ 編輯: nono5938 (119.14.168.131), 03/13/2017 11:36:59
※ 編輯: nono5938 (119.14.168.131), 03/13/2017 11:37:38
GALINE: 魔術方法的好處是你連單純的 get/set 都能用程式控制5F 03/13 12:30
GALINE: 例如你有複雜的白名單機制,或是你內部存資料的方式跟外部
GALINE: 介面不一樣,或是你需要對於 set 進來的東西加料,然後不
GALINE: 想寫同樣的東西寫個五十次之類的
GALINE: 有這種需求的話,就用吧。反過來就是沒這種需求就少用
GALINE: 當然拿來實驗或把玩是沒問題的
GALINE: 這東西有兩個缺點:code 可以變得很難 trace(看你怎麼寫
GALINE: 然後有效能 overhead。當然大部分情況那個 overhead 還好
GALINE: 但是有個很多人在用的東西被 magic function 搞到肥慢慢
GALINE: 該死的 laravel...
MOONRAKER: 一般物件導向語言教材都會先教getProp()/setProp()15F 03/13 12:34
MOONRAKER: 你有幾個prop就寫幾組
MOONRAKER: 一般也建議先習慣這樣 再用get/set這種動態語言的作法
MOONRAKER: 在初學階段最好不要急著想怎麼節省程式碼篇幅
GALINE: 我倒覺得初學試一下也不算壞事,試一下「喔喔喔喔好強」19F 03/13 18:58
GALINE: 然後兩個月後「靠北這段 code 到底在跑三小」也是種體驗
GALINE: 而且悟性好的人搞不好就摸出順眼的用法了
GALINE: 只要不像是 laravel 一樣什麼都要過一次 magic 然後速度
GALINE: 也讓人感覺很 magic....(對我就是吃 slim 這一套 =v=)
nono5938: trace好像確實是個問題,但效能overhead是?不太明白怎24F 03/13 21:26
nono5938: 麼會overhead有個什麼例子嗎?
MOONRAKER: 進去method裏面再switch 跟要改哪個prop就叫哪個method26F 03/14 09:46
MOONRAKER: 用聞的也知道是前面overhead比較多
MOONRAKER: 當然現在php改良很多 是可以試一試
GALINE: https://goo.gl/kljGuw 範例。裡面的數字是 PHP7,PHP5 會29F 03/14 11:19
 
GALINE: 再慢個幾倍。基本上是個平常用兩下沒問題,但是被放到30F 03/14 11:19
GALINE: 大迴圈裡面會有感覺的程度
GALINE: PHP裡面New物件跟call function跟magic function都是相對
GALINE: 昂貴的存在,比較過分的就像Laravel的ORM,對上千個物件
GALINE: 做操作就明顯感到慢,我對這個怨氣很重 :/
GALINE: 當然能升級PHP7的話,升級可以解決很~多效能問題。
GALINE: 但是實際工作很容易看到升不上7的code,還是得注意
MOONRAKER: 最近看到的例子以5.3為主 老到5.1都有 X(37F 03/14 13:07
nono5938: 好吧 多個switch好像是真的會影響到處理的進程,我大概38F 03/14 14:06
nono5938: 瞭解優缺點了謝謝大家
GALINE: 這麼慘,那有機會碰到十倍效能差距...40F 03/14 14:07
GALINE: 我是覺得還是可以玩看看,畢竟用的好的時候可以做出超漂亮
GALINE: 的介面...
tkdmaf: 額外小提醒,在台灣請使用「變數」而不是「變量」這詞。43F 03/16 02:32
nono5938: 有點被同化了 我是在youtube看一個大陸的影片學的QQ44F 03/16 13:19

--
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 120 
作者 nono5938 的最新發文:
  • +6 [請益] 關於魔術方法 set get - PHP 板
    作者: 119.14.168.131 (台灣) 2017-03-12 22:05:25
    我最近算是剛學php 在class的部份有個小問題, 我們在設定private 或是protected的變量時, 我們可以用public function 自己設定一個內部函數 去修改這類型的變量, …
    44F 6推
  • +5 [問題] 我在網上看別人的js都擠成一團? - Web_Design 板
    作者: 119.14.168.131 (台灣) 2017-02-06 15:20:25
    就是有時候我想要知道, 這網頁怎麼寫成這樣的, 當然免不了使用到javascript, 但他們上傳的js怎麼都沒有斷行啊? 是在上傳的時候故意刪掉的嗎? 啊我有沒有辦法用程式 或是其他方法 還原成原來 …
    9F 5推
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇