加入收藏 | 设为首页 | 会员中心 | 我要投稿 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. Person::__set_state(array( 'sex' => '男', 'name' => '小红', 'age' => 25, )) 

十四、 __clone(),当对象复制完成时调用

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

作用:

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

语法:

$copy_of_object = clone $object;

注意:

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

看代码:

  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.     public function __clone() 
  15.     { 
  16.         echo __METHOD__."你正在克隆对象<br>"; 
  17.     } 
  18.  
  19.  
  20. $person = new Person('小明'); // 初始赋值 
  21. $person2 = clone $person; 
  22.  
  23. var_dump('persion1:'); 
  24. var_dump($person); 
  25. echo '<br>'; 
  26. var_dump('persion2:'); 
  27. var_dump($person2);  

看结果:

  1. Person::__clone你正在克隆对象 
  2.  
  3. string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小明" ["age"]=> int(25) } 
  4.  
  5. string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小明" ["age"]=> int(25) }  

克隆成功。

十五、__autoload(),尝试加载未定义的类

作用:

你可以通过定义这个函数来启用类的自动加载。

在魔术函数 __autoload() 方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中 —— 相信这个文件一定会非常大,然后你就痛苦了。

但是有了 __autoload() 方法,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件。

还是通过例子来看看吧:

先看看以往的方式:

  1. /**  
  2.  * 文件non_autoload.php  
  3.  */  
  4.     
  5. require_once('project/class/A.php');   
  6. require_once('project/class/B.php');   
  7. require_once('project/class/C.php');   
  8.     
  9. if (条件A) {   
  10.     $a = new A();   
  11.     $b = new B();   
  12.     $c = new C();   
  13.     // … 业务逻辑   
  14. } else if (条件B) {   
  15.     $a = newA();   
  16.     $b = new B();   
  17.     // … 业务逻辑   
  18. }  

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

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

热点阅读