加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP之十六个魔术方法详解

发布时间:2016-10-29 12:16:49 所属栏目:PHP教程 来源:segmentfault
导读:副标题#e# 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStat

运行结果:

  1. 当在类外部使用unset()函数来删除私有成员时自动调用的 
  2.  
  3. 1当在类外部使用unset()函数来删除私有成员时自动调用的 
  4.  
  5. 1  

九、 __sleep(),执行serialize()时,先会调用这个函数

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。

此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

注意:

__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。

作用:

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

具体请参考如下代码:

  1. <?php 
  2. class Person 
  3.     public $sex; 
  4.     public $name; 
  5.     public $age; 
  6.  
  7.     public function __construct($name="",  $age=25, $sex='男') 
  8.     { 
  9.         $this->name = $name; 
  10.         $this->age  = $age; 
  11.         $this->sex  = $sex; 
  12.     } 
  13.  
  14.     /** 
  15.      * @return array 
  16.      */ 
  17.     public function __sleep() { 
  18.         echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>"; 
  19.         $this->name = base64_encode($this->name); 
  20.         return array('name', 'age'); // 这里必须返回一个数值,里边的元素表示返回的属性名称 
  21.     } 
  22.  
  23. $person = new Person('小明'); // 初始赋值 
  24. echo serialize($person); 
  25. echo '<br/>';  

代码运行结果:

  1. 当在类外部使用serialize()时会调用这里的__sleep()方法 
  2.  
  3. O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}  

十、 __wakeup(),执行unserialize()时,先会调用这个函数

如果说 __sleep() 是白的,那么 __wakeup() 就是黑的了。

那么为什么呢?

因为:

与之相反,`unserialize()` 会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。

作用:

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

还是看代码:

  1. <?php 
  2. class Person 
  3.     public $sex; 
  4.     public $name; 
  5.     public $age; 
  6.  
  7.     public function __construct($name="",  $age=25, $sex='男') 
  8.     { 
  9.         $this->name = $name; 
  10.         $this->age  = $age; 
  11.         $this->sex  = $sex; 
  12.     } 
  13.  
  14.     /** 
  15.      * @return array 
  16.      */ 
  17.     public function __sleep() { 
  18.         echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>"; 
  19.         $this->name = base64_encode($this->name); 
  20.         return array('name', 'age'); // 这里必须返回一个数值,里边的元素表示返回的属性名称 
  21.     } 
  22.  
  23.     /** 
  24.      * __wakeup 
  25.      */ 
  26.     public function __wakeup() { 
  27.         echo "当在类外部使用unserialize()时会调用这里的__wakeup()方法<br>"; 
  28.         $this->name = 2; 
  29.         $this->sex = '男'; 
  30.         // 这里不需要返回数组 
  31.     } 
  32.  
  33. $person = new Person('小明'); // 初始赋值 
  34. var_dump(serialize($person)); 
  35. var_dump(unserialize(serialize($person)));  

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读