PHP学习第十五课:关于类的一些魔术方法

2022-10-11 20:44:45 206 0
魁首哥

感谢关注 PHP学习坊 ,文章内容由 PHP学习坊 收集整理,如有错误或者疏漏之处,欢迎在评论区指出,也欢迎大家积极评论转发。小编需要来自你们订阅、评论的支持,吐槽也好,支持也罢,欢迎大家积极评论。

昨天的内容,就有朋友问小编,父类里面的get 和 set是魔术方法,这两个不是,是自定义的方法,魔术方法是 __get() __set() , 那么,PHP还有哪些魔术方法呢?

PHP学习第十五课:关于类的一些魔术方法

先说明一下,PHP的魔术方法都是以__开头的,所以大家在定义方法名称时,尽量不要使用__开头,除非你的目的就是为了重载现有的魔术方法。尽量避免引起歧义。

老规矩,今天先说一下PHP魔术方法有哪些,以及都有什么作用,明天上代码,实例演示。

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone , __autoload

1、__get

__get( $property ) 当调用一个未定义的属性时访问此方法

2、__ set

__set( $property, $value ) 给一个未定义的属性赋值时会自动触发这一个方法

3、__isset

__isset( $property ) 当在一个未定义的属性上调用isset()函数时会自动触发这一个方法

4、__unset

__unset( $property ) 当在一个未定义的属性上调用unset()函数时会自动触发这一个方法

5、__call

__call( $method, $arg_array ) 为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $args 则以数组的方式接收不存在方法的多个参数。

这里的未定义的方法包括没有权限访问的方法,这个魔术方法是很常用的,尤其是在框架之中,,很多地方都是通过__call方法实现一种调用关系的。大家有兴趣可以找一个框架看下源代码。

6、__autoload

__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

另外,__autoload方法提供一种“lazy load”的机制,当第一次需要使用相关类时调用,这样就不会加载不必要的类。

注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

7、__construct

__construct 构造方法,当一个对象创建时自动调用此方法。PHP在类内部实现一个和类同名的函数,也是 构造函数 ,那么两者区别是什么?

使用__construct方法的好处是:在修改类名的时候,不需要关注构造函数名称的修改,避免了,类名修改,而构造函数名称为修改的问题。

8、__destruct

__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。如果学过c++或者其他面向对象语言的朋友,应该对这个更容易理解一些。

9、__clone

在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

10、__toString

当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in

此方法必须返回一个字符串

11、_ _sleep

串行化的时候用。serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何 序列化 之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。

12、_ _wakeup

反串行化的时候调用 ,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。 使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

13 、__set_state

当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。

本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。

14、__invoke

当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。方法虽然有提供,但是小编没用过,也不建议大家用,实在没想到适合这个方法的真实业务场景。

15 、__callStatic

它的原理参照__call(),只不过他是针对 静态方法 的。

以上是本文内容,谢谢大家。

收藏
分享
海报
0 条评论
206
上一篇:PHP实现灵活排序 下一篇:什么是LAMP和WAMP,一篇文章和你讲清楚

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码