返回首页
当前位置: 主页 > 电脑应用 >

那些年我们错过的魔术方法(魔术方法)

时间:2018-09-17 11:03
   PHP对象的一个优点是可以使用魔法方法。这些方法可以重写一个类的默认行为不改变外部的代码,这使得PHP语法较少的冗余和可扩展性。这些方法都是确定的,他们都是基于双下划线(__)开始。
例如:(__construct),__destruct(),(),()__call __callstatic,__get(),(),()__set __isset,__unset(),__sleep(),(),()__wakeup __tostring,__invoke(),()和()__set_state __clone方法被称为魔术在PHP中(神奇的方法),这些方法名称时不能使用自己命名的类的方法,除非他们想利用他们的神奇功能。

小心 uff1a

PHP将所有__(两个下划线)在魔法的方法开始保留。所以在类定义的方法,除了神奇的方法,不建议__前缀。

1、__get,__set

这两种方法是为类中未声明的属性及其父类设计的。

复制代码代码如下所示:
__get(字符串的名称) / /访问此方法调用未定义的属性时;
__set(字符串的名称,混合价值) / /调用了一个未定义的属性赋值;


这里没有声明包含了访问控制和保护财产,私人(即物业没有权限访问)当使用对象调用。

2、__isset,__unset

复制代码代码如下所示:
__isset(美元资产) / /当一个未定义的属性调用isset()方法调用的函数;
__unset(美元资产) / /当一个未定义的属性称为unset()方法调用的函数;


3、__call,__callstatic

复制代码如下:__call(字符串的名称,数组参数) / /调用一个未定义的方法时,调用此方法。

此处未定义的方法包括一种不访问权限的方法。

复制代码如下:__callstatic(字符串的名称,数组参数)

__callStatic () is called when an unaccessible method (such as undefined, or invisible) is called in a static method.

__callstatic其工作方式类似于__call()魔术的方法,和__callstatic()是用来处理静态方法调用,和php5.3.0以上版本是有效的。
PHP并加强对__callstatic定义()方法;它必须是公共的,必须声明为静态的。同样,在__call魔法()方法必须定义为public,和所有其他神奇的方法必须相同。

4、__autoload

的__autoload功能,将自动调用当试图使用一个类没有定义。通过调用这个函数,脚本引擎已在PHP无法加载所需的类的最后机会。
注:抛出的异常在__autoload函数不能用catch语句块捕获并导致一个致命的错误。


5、__construct,__destruct

的__construct施工方法时调用此方法创建一个对象。
使用此方法的优点是,无论其所在的类的名称如何,构造方法都可以具有唯一的名称。因此,当您更改类的名称时,您不需要更改构造方法的名称。
__destruct析构函数的方法,PHP将销毁对象前,调用这个方法,才能从内存中删除。
默认情况下,PHP只释放对象属性占用的内存,并销毁与对象相关的资源。
析构函数允许您在使用对象后执行任意代码来清除内存。
当PHP决定您的脚本不再与对象相关时,析构函数将被调用。
在函数的命名空间中,这种情况发生在函数返回时。
全局变量,这发生在脚本结束。如果你想摧毁一个目标明确,你可以到变量指向对象指定的任何其他值,通常为变量赋值为空或调用unset。

6、__clone

物体在PHP5的分配是分配的参考使用。如果要复制对象,则需要使用克隆方法。调用此方法时,对象会自动调用__clone魔术方法。
如果一些初始化操作需要对对象的复制,可在__clone方法实现。

7、__tostring

复制代码代码如下所示:
公共字符串__tostring(void)


的__tostring方法是当一个对象被自动转换成一个字符串,例如当一个回声是用来打印的对象。应该显示。该方法必须返回一个字符串,否则致命错误的e_recoverable_error水平将发布。

复制代码代码如下所示:
MyObject = new MyClass()美元;
echo MyObject;
将寻找一个魔术方法
$ MyObject -> __tostring();


注意:你不能抛出一个异常,在__tostring()方法。这样做会导致致命的错误。

需要指出的是,在PHP 5.2.0,的__tostring()方法只能生效时,它直接用于回声或打印。在PHP 5.2.0,它可以在任何环境下有效的字符串(例如printf(),使用%s改性剂),但它不能用于非字符串的环境,如%d修饰符。从PHP 5.2.0,如果未定义的__tostring对象()方法转换成一个字符串,一个e_recoverable_error水平将会产生错误。

8、__sleep()和()__wakeup

复制代码代码如下所示:
公共数组__sleep(void)
__wakeup虚空(void)


serialize()函数检查是否有一个神奇的方法__sleep()的类,如果存在,该方法被称为第一,然后序列化操作执行。此功能可用于清理对象并返回一个数组,包含所有的变量的名字应该被序列化的对象如果该方法不返回任何内容,空被序列化并在e_notice水平产生一个错误。

小心:

__sleep()不返回父类的私有成员的名称,其产生的e_notice级错误。它可以通过序列化接口取代。
的__sleep()方法通常用于提交未提交的数据,或类似的清洗作业。同时,如果有一些大的物体,但不需要全部保存,这个功能很好。
与此相反,序列化()检查是否有一个__wakeup()方法,如果存在的话,那__wakeup方法叫做准备事先由对象所需的资源。
__wakeup()经常用在反序列化操作,如重新建立数据库连接,或执行其他初始化操作。

9、__invoke()

复制代码如下:混合__invoke({ $…})

的__invoke()方法会自动调用在调用一个对象的函数调用的方式。

10、__set_state()

复制代码如下:静态对象__set_state(数组属性)

这种静态的方法将被调用,当var_export()()类是PHP 5.1.0叫出口。
这个方法的唯一参数是一个数组,其中包含阵列(财产的价值属性,…)。
------分隔线----------------------------
推荐内容