PHP魔术方法什么时候用,具体用法是怎样
Admin 2022-08-15 群英技术资讯 469 次浏览
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。魔术方法很多还是成对出现的,以下列出目前PHP中所有的模式方法。
1.__construct,__destruct
__constuct构建对象的时被调用;
__destruct明确销毁对象或脚本结束时被调用;
2.__get,__set
__set当给不可访问或不存在属性赋值时被调用
__get读取不可访问或不存在属性时被调用
3.__isset,__unset
__isset对不可访问或不存在的属性调用isset()或empty()时被调用
__unset对不可访问或不存在的属性进行unset时被调用
4.__call,__callStatic
__call调用不可访问或不存在的方法时被调用
__callStatic调用不可访问或不存在的静态方法时被调用
5.__sleep,__wakeup
__sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__wakeup当使用unserialize时被调用,可用于做些对象的初始化操作
6.__clone
进行对象clone时被调用,用来调整对象的克隆行为
7.__toString
当一个类被转换成字符串时被调用
8.__invoke
当以函数方式调用对象时被调用
9.__set_state
当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
10.__debuginfo
当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
PHP魔术方法使用实例如下:
1 <?php 2 3 class Magic 4 { 5 public $var = 'test'; 6 7 //构造函数,在创建对象的时候调用 8 public function __construct() 9 { 10 echo '__construct called'.PHP_EOL; 11 } 12 13 //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用 14 public function __destruct() 15 { 16 echo '__destruct called'.PHP_EOL; 17 } 18 19 //当给不可访问或不存在属性赋值时被调用 20 public function __set($name, $value) 21 { 22 echo $name.'-'.$value; 23 echo '__set called'.PHP_EOL; 24 } 25 26 //读取不可访问或不存在属性时被调用 27 public function __get($name) 28 { 29 echo $name; 30 echo '__get called'.PHP_EOL; 31 } 32 33 //调用不可访问或不存在的方法时被调用 34 public function __call($name, $arguments) 35 { 36 echo $name . '-' . implode(',', $arguments); 37 echo '__call called'.PHP_EOL; 38 } 39 40 //调用不可访问或不存在的静态方法时被调用 41 public static function __callStatic($name, $arguments) 42 { 43 echo $name . '-' . implode(',', $arguments); 44 echo '__callStatic called'.PHP_EOL; 45 } 46 47 //对不可访问或不存在的属性调用isset()或empty()时被调用 48 public function __isset($name) 49 { 50 echo $name; 51 echo '__isset called'.PHP_EOL; 52 return true; 53 } 54 55 //对不可访问或不存在的属性进行unset时被调用 56 public function __unset($name) 57 { 58 echo $name; 59 echo '__unset called'.PHP_EOL; 60 } 61 62 //serialize时被调用,当你不需要保存大对象的所有数据时很有用 63 public function __sleep() 64 { 65 echo '__sleep called'.PHP_EOL; 66 return array('var1111111111'); 67 } 68 69 //unserialize时被调用,可用于做些对象的初始化操作 70 public function __wakeup() 71 { 72 echo '__wakeup called'.PHP_EOL; 73 $this->var = 'test after wakeup'; 74 } 75 76 //当一个类被转换成字符串时被调用 77 public function __toString() 78 { 79 return '__toString called'.PHP_EOL; 80 } 81 82 //进行对象clone时被调用,用来调整对象的克隆行为 83 public function __clone() 84 { 85 echo '__clone called'.PHP_EOL; 86 } 87 88 //当以函数方式调用对象时被调用 89 public function __invoke() 90 { 91 echo '__invoke called'.PHP_EOL; 92 } 93 94 //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。 95 public static function __set_state($arr) 96 { 97 return '__set_state called'.PHP_EOL; 98 } 99 100 //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 101 public function __debuginfo($arr) 102 { 103 echo '__debuginfo called'.PHP_EOL; 104 return array( 105 'var' => 'test fro __debuginfo' 106 ); 107 } 108 } 109 110 $m = new Magic(); //__construct()被调用 111 $m->not_exist_property = test; //__set()被调用 112 echo $m->not_exist_property;//__get()被调用 113 $m->abc(1,2,3); //__call()被调用 114 echo isset($m->not_exist_property); //__isset()被调用,返回bool值 115 unset($m->not_exist_property); //__unset()被调用 116 echo $tmp = serialize($m); //__sleep()被调用 117 unserialize($tmp); //__wakeup()被调用 118 $m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制 119 $m(); //__invoke() 120 eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); 121 var_dump($m); 122 //最后__destruct()被调用 123 124 /* 125 结果: 126 __construct called 127 not_exist_property-test__set called 128 not_exist_property__get called 129 abc-1,2,3__call called 130 not_exist_property__isset called 131 1not_exist_property__unset called 132 __sleep called 133 O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called 134 __destruct called 135 __clone called 136 __invoke called 137 string(20) "__set_state called 138 " 139 class Magic#1 (1) { 140 public $var => 141 string(4) "test" 142 } 143 __destruct called 144 __destruct called 145 146 147 */
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在PHP中,您可以在服务器执行PHP文件之前在该文件中插入一个文件的内容。include和require语句用于在执行流中插入写在其他文件中的有用的代码。include和require除了处理错误的方式不同之外,在其他方面都是相同的:
本文主要给大家分享关于laravel中外键约束的应用,下面有具体的实例详解,具有一定的参考价值,有学习需要的朋友可以了解了解,下面一起跟随小编来看看吧。
这篇文章主要介绍了PHP实现微信提现功能,此类功能在微信商城中经常会用到,今天小编通过实例代码给大家讲解,需要的朋友可以参考下
字符串的操作在PHP开发中是很基础的,而它的功能强大,是我们所不能想象的,小编今天就为大家总结PHP开发中字符串的函数实现,希望能为你带来便利。
在学习PHP时,我们比较常见的PHP设计模式有策略模式。工厂模式、单例模式、注册模式和适配器模式这五种,当然PHP设计模式还有很多。这篇文章主要给大家介绍的是关于适配器模式的原理以及用法等等,感兴趣的朋友接着看。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008