php 作为快速迭代项目的语言,其牛逼性质自不必多说。今天咱们要来说说php语言几个魔术方法,当然了,本文主要以setter&getter方法说明为主。

  首先,咱们得知道什么叫魔术方法? 官方定义为:__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

  妈蛋,看了这么长一句,还是不明白什么叫魔术方法?

  换句简单的话就是(片面的),普通方法做不了的事,这个方法能做到,这就是魔术方法! 总之就是,你平时一般不会用到的方法。

  好,现在咱们来说说,哪几个方法是咱们用得最多的呢?当然是 __construct, __destruct 了,创建一个类时,会使用到构造方法(__construct),你可以初始化你的基本数据在里面。销毁一个类时,则会调用析构方法(__destruct),你可以回收一些东西。

  除了这前面两个方法之外,其他的方法就不一定是每个同学都会用得上的功能了。如果说一定要使用的话,那可能还会用到 __call 方法,因为有时候你可能就是要让外面访问你某些变异了的方法,以迷惑对手。

  那么,回到本文话题,php的setter&getter方法,其实就是 __set & __get 方法,为什么说是setter&getter呢,因为在面向对象语言中,就是setXX($value),getXX(); 这两个魔术方法有什么用呢?

  首先,我们还是魔术方法的方针政策上,魔术方法是具有魔术的,是不能随便调用的,它只会在特定的情况下才会生效。

  那么__set 方法呢,就是在你在设置某个类属性变量的时候(如$obj->mm = "c";),如果没有找到这个变量或者该变量不可访问,那么__set就会生效被调用了。

  而 __get 方法,就是在你获取类的某个类属性变量的时候(如$a = $obj->mm),如果访问不到这个属性,那么 __get就会生效被调用了。 举例:

<?phperror_reporting(E_ALL^E_NOTICE);class SampleMagicTest {public $a;private $privVar = "privateVar";protected $protectedVar = "protectedVar";public function __construct($a) {$this->a = $a;var_dump("in __construct method....", $a);}public function __set($name, $value) {echo "in __set method...\n";$this->$name = $value;            //设置$name属性为该类属性变量,我猜测修饰符应该是 private, 也就是说 外部仍然是访问不到该变量的,但是结果却让我失望了,居然被设置成public,也就是说,你可直接访问到该变量了//当然了,你还可以做其他没用的事
        }public function __get($name) {echo "in __get method...\n";return $this->$name;            //返回类属性变量 $name, 该$name通常是私有的变量//当然了,你还可以做其他没用的事
        }public function __call($name, $arguments) {var_dump("you called a none defined method,methodName is:", $name, " args is:", $arguments);}public function __destruct() {echo "in __construct method...\n";return "SampleMagicTest.class.toString\n";}public function __toString() {echo "in __toString method...\n";}}$sample = new SampleMagicTest("1");$sample->yourName = "jue";                //属性不存在, __set 魔术将生效echo "yourName:" . $sample->yourName . PHP_EOL;        //由于前面的 __set已经将变量放入,此处可以直接调用,没毛病var_dump($sample->aNoneExistVar);        //直接调用一个不存在的变量$sample->sayHi("hello");            //调用一个不存在的方法,则会触发 __call方法,也就是说,当有了 __call方法之后,php就再也不会报方法未定义之类的错误了,这坑可是不小哦var_dump($sample);    unset($sample);            // 可以主动调用销毁方法,当然了,实际开发中是不建议这么干的echo "real over...";
?>

  输出结果如下:

$-#: php SampleMagicTest.php
string(25) "in __construct method...."
string(1) "1"
in __set method...
yourName:jue
in __get method...
NULL
string(47) "you called a none defined method,methodName is:"
string(5) "sayHi"
string(9) " args is:"
array(1) {[0]=>string(5) "hello"
}
in __toString method...
SampleMagicTest.class.toString
object(SampleMagicTest)#1 (4) {["a"]=>string(1) "1"["privVar":"SampleMagicTest":private]=>string(10) "privateVar"["protectedVar":protected]=>string(12) "protectedVar"["yourName"]=>string(3) "jue"
}
in __construct method...
real over...

  如此,测试完毕。

  说实话,我一点都没感觉到 __set&__get 方法的方便之处在哪里,而__call方法反而作用会大些(有坑自己别往里跳就行),尤其作为反射功能的调用时。

  而我能想到的setter&getter的作用,则更多的是提示你在获取属性时,IDE能给你一个准确的提示,那将是美好的。

  我看过某人写过的代码,将某个配置设值功能作为调用 __set方法的场景(如: public funtion($name, $value) {$this->config[$name] = $value;},这种情况,恕在下不敢苟同。你直接写个易记的方法不就行了吗?

  魔术方法存在自然有其过人之处,但是,并不是每个场景都能使用,大部分情况可能只需要看看就好。

  如果一定要给这些魔术方法的功能重要性排个序的话,我想官方已经把他排出来了。

  你有什么场景在用这些牛逼的魔术方法呢?不访说出来,吓我一跳。。。

周末,说声php的settergetter(魔术)方法,你们辛苦了相关推荐

  1. 介绍Python的魔术方法 - Magic Method

    前言 在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__. 有些魔术方法,我们可能以后一辈子都不会再遇到了,这里也就只是简单 ...

  2. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  3. python算术运算相关魔法方法_运算符相关的魔术方法

    运算符相关的魔术方法实在太多了,j就大概列举下面两类: 1.比较运算符魔术方法说明 __cmp__(self, other)如果该方法返回负数,说明 self < other; 返回正数,说明 ...

  4. PHP中魔术方法的用法

    PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...

  5. python 类的魔术方法_python中类的魔术方法

    目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class时一定会接触到它的magic methods ...

  6. python魔术方法call_php魔术方法__call

    __call是魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法 class test { public function emptyFunc(){ $getA ...

  7. php 魔术方法 说明

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的. ◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名. ◆_ ...

  8. php 魔术方法 多继承,day23:单继承多继承菱形继承__init__魔术方法

    原文:https://www.cnblogs.com/libolun/p/13434675.html 单继承 关于继承的一些基本概念 1.什么是子类?什么是父类?如果一个类继承另外一个类,该类叫做子类 ...

  9. Python最会变魔术的魔术方法,我觉得是它

    在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了一个例外:一个非常神秘的魔术方 ...

最新文章

  1. python装饰器函数-python之路——装饰器函数
  2. 跨域问题解决方案--Nginx代理转发
  3. VHDL的数据对象(学习笔记1)
  4. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...
  5. vscode 多行 行尾_vscode 常用快捷键
  6. qt 进度条最小_QT:圆形进度条设计
  7. symfony ajax,如何在php或symfony中使用jQuery ajax上传文件
  8. HDU-1394 Minimum Inversion Number 线段树+逆序对
  9. form表单提交大量input,php接收不全
  10. 双层pdf解析 java_java转双层pdf
  11. 【kvm虚拟化详解01】-虚拟化概述和主流方案介绍
  12. 行业知识图谱调查报告(二):知识图谱构建及行业知识图谱构建举例
  13. 如何用css实现元素固定宽高比?
  14. 混淆电路的优化:PP、Free XOR、GRR
  15. GHostNet网络最通俗易懂的解读【不接受反驳】
  16. 2021-08-19
  17. 记录一下如何运行MDX文件
  18. Excel·VBA选中列一键计算小计总计
  19. centos 中使用sqlplus 登陆oracle提示bash.sqlplus命令未找到的解决方法
  20. 【判断蜂蜜真伪的简单方法】

热门文章

  1. cocos2dx基础篇(29)——屏幕适配
  2. 通用函数get和set
  3. 严重红色警告-虾子+维C=砒霜
  4. java基本数据类型和包装类相互转换
  5. 单例模式之懒汉式/饿汉式/结合二者之优的模式
  6. VC ADO连接ACCESS步骤及错误处理
  7. JavaScript中函数的变量提升问题
  8. ------------ 异常笔记
  9. arcgis9.2的安装方法
  10. oracle 12c dg新特性,Oracle 12c DG新特性---一键switchover