[请益] 关于魔术方法 __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