PHP常用魔术方法的功能及使用实例
总结在面向对象的编程,PHP提供了一系列神奇的方法,提供了很多方便编程,PHP的方法通常在__魔法(两个下划线),而不需要显式调用它从一定的条件。本文简要总结提供PHP中神奇的方法。
开始之前
在总结PHP的神奇方法之前,定义了两个类,以便使用后面的示例:
复制代码代码如下所示:
< PHP
类设备{
公开名称;
公用电池;
公共数据$ =数组();
公用连接;
受保护函数连接(){
美元->连接=资源;
返回这个名称。连接。php_eol;
}
受保护功能断开连接(){
$;
返回这个名称。断开的。php_eol;
}
}
类电池{
私人收费= 0;
公共功能setcharge(元电荷){
费用=(整数)美元;
如果($ $ 0){
0美元;
}
($费> 100){
100美元;
}
这个费用=收费;
}
}
>
设备类有四个成员属性和两个成员方法。
构造函数和析构函数
构造函数和析构函数分别叫:当对象被创建和销毁。销毁对象,没有对象的引用,如引用变量,删除(取消),重新分配或在脚本执行结束执行,并调用析构函数。
__construct()
的__construct()构造函数是使用最频繁的功能为止。当创建一个对象时,初始化工作可以在构造函数中完成的。你可以定义构造函数的任何参数,只要相应数量的参数传递到实例化。任何例外出现在构造函数阻止一个对象的创建。
复制代码代码如下所示:
类设备{
公共功能__construct(电池为电池,$name){
美元=电池=电池;
这个名字;
$ >连接();
}
}
在上面的示例中,设备类的构造函数分配成员属性并调用连接()方法。
复制代码代码如下所示:
构造函数方法可以防止在类之外创建对象,这通常是在简单模式中使用的。
__desctruct()
析构函数通常在对象被销毁时调用,析构函数不接收任何参数。一些清理工作通常在析构函数中执行,例如关闭数据库连接,等等。
属性重载(属性重载)
需要注意的一点是,PHP中的重载与大多数其他语言的重载不同,尽管它具有相同的功能。
涉及属性重载的两种魔力方法主要用于处理属性访问,并定义当我们试图访问不存在(或不能访问)属性时发生的情况。
__get()
神奇方法__get()被调用时,我们试图访问一个不存在的属性。它接收到一个参数表示的访问属性名称并返回该属性的值。在上面的设备类,有一个数据属性,在这里工作,如下面的代码:
复制代码代码如下所示:
类设备{
公共功能__get($name){
如果(array_key_exists($name,美元->数据)){
返回$ >数据{名称};
}
返回null;
}
}
这种神奇的方法最常见的地方是通过创建只读属性来扩展访问控制。我们可以扩展属性__get可读但魔术方法不修改。代码如下:
复制代码代码如下所示:
类电池{
私人收费= 0;
公共功能__get($name){
如果(isset(美元-> $name)){
返回$;
}
返回null;
}
}
__set()
的__set魔法()方法被调用时,我们试图修改是不可访问的属性。它接收两个参数,一个表示该属性的名称,一个表示该属性的值:
复制代码代码如下所示:
类设备{
公共功能__set($name,美元价值){
使用属性名称作为数组键
这个数据{ $ };
}
}
__isset()
魔法的__isset()方法被调用时,isset()方法是一个不可访问的属性调用,它接收一个参数表示的属性的名称。它应该返回一个布尔值,指示属性是否存在。代码如下:
复制代码代码如下所示:
类设备{
公共功能__isset($name){
返回array_key_exists($name,美元->数据);
}
}
__unset()
的__unset()神奇的方法被调用时,unset()函数被调用,摧毁一个难以接近的性质,它接收一个参数,表示该属性的名称。
对象被转换为字符串。
有时我们需要显示一个字符串的形式对象。如果我们直接打印一个对象,然后程序会输出一个错误信息:PHP开捕致命错误:类设备对象不可能,不。
__tostring()
__tostring()被调用时,我们使用一个对象作为一个字符串,它不接受任何参数,该方法允许我们定义的对象的形式,代码如下:
复制代码代码如下所示:
类设备{
公共功能__tostring(){
连接=(isset(美元美元->连接))'connected:'disconnected;
$ =计数($ > data);
返回这个名称。是的。$连接。$内存中的项目。php_eol;
}
…
}
__set_state()(PHP 5.1)
静态的神奇方法,__set_state(),调用方法时,我们用var_export()函数来输出对象,var_export()函数是用来把PHP变量为PHP代码,它接收一个数组包含该对象的属性值作为参数,示例代码如下:
复制代码代码如下所示:
类电池{
…
公共静态函数__set_state(数组){
$ obj =新的自我();
$ obj -> setcharge($array { 'charge});
返回的对象;
}
…
}
克隆对象
默认情况下,对象都是通过引用传递的。因此,当将一个对象分配给另一个变量时,只创建对象的引用,而对象不被复制。为了真正复制对象,我们需要使用克隆关键字。
这种引用策略也适用于对象中包含的对象。即使我们克隆对象,对象内的任何对象也不会被克隆,所以最终的结果是两个对象共享同一内部对象:
复制代码代码如下所示:
美元=新设备装置(新电池(),'imagic);
合器2美元=克隆装置;
$设备->电池-> setcharge(65);
echo $器2 -> ->充电电池;
65
__clone()
的__clone()()__clone神奇的方法可以解决上述问题。神奇的方法被调用时,clone关键字用于对象。在这神奇的方法,可以实现对亚克隆对象。代码如下:
复制代码代码如下所示:
类设备{
…
公共功能__clone(){
我们的电池对象复制
这个电池=克隆电池;
}
…
}
对象序列化
序列化是将任意数据到一个字符串格式的过程。序列化通常用来保存整个对象到数据库或写一个文件。当我们反序列化存储的数据,我们可以在序列化的对象。然而,并不是所有的数据可以被序列化,如数据库连接幸运的是,有一种神奇的方法来帮助我们解决这个问题。
__sleep()
神奇方法__sleep()被调用时,对象序列化(称Serialize()),它不接受任何参数,并返回一个数组包含所有的属性应该被序列化。在魔术的方法,其他一些操作也可以进行。
需要注意的一点是,不要在这个函数中执行任何析构函数,因为它可能会影响运行对象。
示例代码如下所示:
复制代码代码如下所示:
类设备{
公开名称;
公用电池;
公共数据$ =数组();
公用连接;
…
公共功能__sleep(){
返回的数组('name','电池'数据');
}
…
}
__wakeup()
神奇方法__wakeup()被调用时,存储的对象是可序列化的。它不接受任何参数,也没有返回值,它可以用来处理丢失的数据库连接或资源在序列化过程中,代码如下:
复制代码代码如下所示:
类设备{
…
公共功能__wakeup(){
重新连接到网络
$ >连接();
}
…
}
超载
PHP也有两大神奇的方法给会员的相关方法,__call()和__callstatic(),和这两大神奇的方法类似于属性的重载方法。
__call()
神奇的方法称为()__call称不存在或无法访问的方法时,它接收两个参数,一个是调用的方法的名字,另一个是数组包含该函数的参数,我们可以使用这个方法来调用基类中的同名功能。
在这个例子中,注重功能call_user_func_array(),它允许我们动态地调用指定函数。
示例代码如下所示:
复制代码代码如下所示:
类设备{
…
公共功能__call($name,$参数){
确保我们的子对象有这个方法
如果(method_exists(美元->连接,$name)){
将调用转发给我们的子对象
返回call_user_func_array(阵列(美元->连接,$name),为参数);
}
返回null;
}
…
}
__callstatic()
神奇的方法__callstatic(),这是作为__call功能相同的()。唯一的区别是,当试图访问不存在或不能访问的静态方法时,该方法将被调用:
复制代码代码如下所示:
类设备{
…
公共静态函数__callstatic($name,$参数){
确保我们的类有这个方法
如果(method_exists(连接,$name)){
将静态调用转发给我们的类
返回call_user_func_array(array(连接,$name),为参数);
}
返回null;
}
…
}
对象作为函数
有时我们需要使用对象作为一个函数,使用对象作为一个函数,因为我们可以使用其他的普通函数来传递引用。
__invoke()(PHP 5.3)
神奇方法__invoke()是当它试图使用对象作为函数调用。任何参数定义该方法将作为函数的参数,示例代码如下:
复制代码代码如下所示:
类设备{
…
公共功能__invoke($数据){
回波数据;
}
…
}
美元=新设备装置(新电池(),'imagic);
合装置(测试);
/ /当量至设备-> __invoke(测试)
输出:测试
其他:__autoload()
的__autoload()方法是一个神奇的方法,但这种方法是很有用的。但是,功能不推荐用于PHP版本更新,取而代之的是spl_auto_register()函数。