《PHP学习第十五课:关于类的一些魔术方法》要点:
本文介绍了PHP学习第十五课:关于类的一些魔术方法,希望对您有用。如果有疑问,可以联系我们。
欢迎参与《PHP学习第十五课:关于类的一些魔术方法》讨论,分享您的想法,维易PHP学院为您提供专业教程。
感谢关注PHP学习坊,文章内容由PHP学习坊收集整理,如有错误或者疏漏之处,欢迎在评论区指出,也欢迎大家积极评论转发.小编必要来自你们订阅、评论的支持,吐槽也好,支持也罢,欢迎大家积极评论.
昨天的内容,就有朋友问小编,父类里面的get 和 set是魔术办法,这两个不是,是自定义的办法,魔术办法是 __get() 和 __set() , 那么,PHP还有哪些魔术办法呢?
先说明一下,PHP的魔术办法都是以__开头的,所以大家在定义办法名称时,尽量不要使用__开头,除非你的目的就是为了重载现有的魔术办法.尽量避免引起歧义.
老规矩,今天先说一下PHP魔术办法有哪些,以及都有什么作用,明天上代码,实例演示.
PHP中的魔术办法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone , __autoload
__get( $property ) 当调用一个未定义的属性时拜访此方法
__set( $property, $value ) 给一个未定义的属性赋值时会自动触发这一个办法
__isset( $property ) 当在一个未定义的属性上调用isset()函数时会自动触发这一个办法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时会自动触发这一个办法
__call( $method, $arg_array ) 为了避免当调用的办法不存在时产生错误,可以使用 __call() 办法来避免.该办法在调用的办法不存在时会自动调用,程序仍会继续执行下去.
该办法有两个参数,第一个参数 $function_name 会自动接收不存在的办法名,第二个 $args 则以数组的方式接收不存在办法的多个参数.
这里的未定义的方法包括没有权限拜访的方法,这个魔术方法是很常用的,尤其是在框架之中,,很多地方都是通过__call方法实现一种调用关系的.大家有兴趣可以找一个框架看下源代码.
__autoload 函数,它会在试图使用尚未被定义的类时自动调用.通过调用此函数,脚本引擎在 PHP 失足失败前有了最后一个机会加载所需的类.
另外,__autoload办法提供一种“lazy load”的机制,当第一次需要使用相关类时调用,这样就不会加载不必要的类.
注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕捉并导致致命错误.
__construct 构造办法,当一个对象创建时自动调用此办法.PHP在类内部实现一个和类同名的函数,也是构造函数,那么两者区别是什么?
使用__construct办法的好处是:在修改类名的时候,不需要关注构造函数名称的修改,避免了,类名修改,而构造函数名称为修改的问题.
__destruct 析构办法,PHP将在对象被销毁前(即从内存中清除前)调用这个办法.如果学过c++或者其他面向对象语言的朋友,应该对这个更容易理解一些.
在多数情况下,我们并不需要完全复制一个对象来获得其中属性.但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源.你可能会想复制一个新的窗口,坚持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口).还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本.
对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 办法).对象中的 __clone() 办法不能被直接调用.
当我们调试程序时,需要知道是否得出正确的数据.比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString办法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString办法,格式化输出这个对象所包含的数据.如果类没有实现此办法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
此办法必须返回一个字符串
串行化的时候用.serialize() 检查类中是否有魔术名称 __sleep 的函数.如果这样,该函数将在任何序列化之前运行.它可以清除对象并应该返回一个包括有该对象中应被序列化的所有变量名的数组.
反串行化的时候调用,unserialize() 检查具有魔术名称 __wakeup 的函数的存在.如果存在,此函数可以重建对象可能具有的任何资源.使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处置其它重新初始化的任务.
当调用var_export()时,这个静态 办法会被调用(自PHP 5.1.0起有效).
本办法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性.
当尝试以调用函数的方式调用一个对象时,__invoke 办法会被自动调用.办法虽然有提供,但是小编没用过,也不建议大家用,实在没想到适合这个办法的真实业务场景.
它的原理参照__call(),只不过他是针对静态办法的.
以上是本文内容,谢谢年夜家.