PHP常用魔法函数
-
__construct()
和 __destruct()
__construct()
对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。__destruct()
当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
2. __get()
和 __set()
面向对象编程中使用频率很高的两个方法.当设置和获取对象的属性不允许访问时性,此方法会被调用。一定注意是不存在或不允许被读写时才会被调用。
因此对于一个对象,其属性不确定时,用这两个方法效果很好。
__get($name)
获取对象不存在的属性或无法访问的属性时调用.$name
表示要获取的属性名
__set($name, $value)
设置对象不存在的属性或无法访问的属性时调用.$name
表示要设置的属性名,$value
表示要设置的值.
__isset()
和 __unset()
这两个方法用得比较少些。当调用方法isset()
判断对象是否存在某属性, 调用unset()
注销某属性时。且当这些属性不存在或不可访问时,会分别调用__isset()
和__unset()
方法
与前面的__get()
和__set()
略同。都是某属性不存在或不可访问时被调用
__isset($name)
当调用方法isset()
方法判断不可访问的类属性时调用.$name
表示属性名.
__unset($name)
当调用方法unset()
方法删除不可访问的类属性时调用.$name
表示属性名.
__call()
和 __callStatic()
前面,我们发现,在获取对象的属性时,如果此属性不存在会调用__get()
方法。那么如果调用此对象的方法时,如果此方法不存在呢?php
引擎会自动调用__call()
方法。
同样,如果调用的是静态方法,且不存在时会调用__callStatic()
方法。需要注意的是,__callStatic()
使用时是一个静态方法,且仅在php5.3
以上版本才支持.
__call($method, $args)
调用对象方法不存在或不允许被调用时此方法会被调用。$method
表示调用的方法名,$args
表示调用的参数
__callStatic($method, $args)
调用对象的静态方法不存在或不允许被调用时此方法会被调用。$method
表示调用的方法名,$args
表示调用的参数.
__sleep()
和 __wakeup()
这两个方法,咋一看,就是睡觉和唤醒嘛。那跟对象有什么关系?有时候该用的时候也想不起来。其实,我们简单点记,在php
中有一个让对象睡觉的方法,叫searialize()
,
它会将对象的各属性序列化以方便保存起来。而unsearialize()
方法是将保存的序列化的数据解开变成对象。也叫唤醒。相对应的,当睡觉时,php
会调用__sleep()
方法,它
的返回值必须是一个数组,表示需要保存的属性项, 对于文件句柄,数据库连接等资源类型的数据是不能被序列化保存的。同理唤醒对象时,php
会调用__wakeup()
方法,
但与__sleep()
不同的是,它返回值为空。被保存的属性都会被解开。那它有什么用呢?刚我们说了,searialize
是不能保存资源的。那么唤醒时如果我们想用到这些资源怎么
办?回答很肯定,重新创建?那在哪里创建合适呢?当然是__wakeup()
方法里面,因为每次唤醒时都会调用此方法嘛。这下我们很清楚这两个方法的用途了。
__sleep()
当调用searialize()
方法时调用,返回值为数组,表示需要序列化的数据项.
__wakeup()
当调用unsearizlie()
方法时调用。一般用来在唤醒时初始化资源对象.
__toString()
当对象在需要转换成字符串时,会调用此方法。例如,echo
对象时,将对象强制转换为string
类型时,
用于字符串参数的函数中.注意:此方法的返回值必须为字符串。
__clone()
此方法在复制对象时被调用。我们知道在php
中.$a
为一个对象,$b=$a
时。$b
为$a
的引用。当$a
发生改变时。$b
也会随之发生变化。那么为了使$b
不发生变化,我们需要用$b=clone $a
;
那么,当$a
在调用clone
的时候,引擎会自动调用__clone()
方法
__autoload()
autoload
顾名思义就是自动加载。它主要用来自动加载类。那如何自动加载呢?我们都知道在php
中,要使用另外一个文件中的类需要用require
或include
方法
(包括require_once
和include_one
)导入进来。那么如果我要使用的类未被导入,则引擎会自动调用__autoload()
方法。利用此特性,当我们的类名和类文件有规律
地存放时,我们可以使用__autoload()
方法,根据需导入的类名,让程序自动导入文件。此函数在许多的MVC
框架中起着重要的作用。
__autoload($name)
$name
表示需要自动导入的类名
__set_state()
这个方法用得不多。了解这个方法前,需要先知道var_export()
函数,var_export()
和var_dump()
类似,输出一个变量的字符串表示。他与var_dump
的区别在于它的返回结果的是合法的
php
代码.此代码可以被eval
执行. 注意:此方法是一个静态方法,且在php5.1
以上版本才支持。
__invoke()
这个方法我刚开始接触的时候,一眼望去,真看不出来它到底干嘛的。主要是不明白invoke
是啥意思。后来查了字典才明白。意思是呼叫。英语差伤不起呀。
在php
中这个方法用于,把对象当方法用的时候。此方法会被调用。很简单。注意,此方法仅5.3
以上版本支持。
__unserialize()
当对象被反序列化 unserialize()
的时候,会尝试调用该方法,并忽略 __wakeup()
。此函数将会传递从 __serialize()
返回的恢复数组(序列化后的字符串),然后它可以根据需要从该数组中恢复对象的属性。
__serialize()
当对象被序列化 serialize()
的时候,会尝试调用该方法,并忽略 __sleep()
。此函数会代替 serialize()
返回一个数组(序列化后的字符串
)