当前位置:首页 > PHP教程 > php面向对象 > 列表

PHP中的魔术方法总结和使用实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-26 15:24:03 浏览: 评论:0 

魔术方法是PHP面向对象中特有的特性,它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法),魔术方法很多还是成对出现的,以下列出目前PHP中所有的模式方法。

1.__construct,__destruct

__constuct构建对象的时被调用;

__destruct明确销毁对象或脚本结束时被调用;

2.__get,__set

__set当给不可访问或不存在属性赋值时被调用

__get读取不可访问或不存在属性时被调用

3.__isset,__unset

__isset对不可访问或不存在的属性调用isset()或empty()时被调用

__unset对不可访问或不存在的属性进行unset时被调用

4.__call,__callStatic

__call调用不可访问或不存在的方法时被调用

__callStatic调用不可访问或不存在的静态方法时被调用

5.__sleep,__wakeup

__sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用

__wakeup当使用unserialize时被调用,可用于做些对象的初始化操作

6.__clone

进行对象clone时被调用,用来调整对象的克隆行为

7.__toString

当一个类被转换成字符串时被调用

8.__invoke

当以函数方式调用对象时被调用

9.__set_state

当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。

10.__debuginfo

当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本

PHP魔术方法使用实例如下:

  1. <?php 
  2.    
  3. class Magic 
  4.   public $var = 'test'
  5.    
  6.   //构造函数,在创建对象的时候调用 
  7.   public function __construct() 
  8.   { 
  9.     echo '__construct called'.PHP_EOL; 
  10.   } 
  11.    
  12.   //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用 
  13.   public function __destruct() 
  14.   { 
  15.     echo '__destruct called'.PHP_EOL; 
  16.   } 
  17.    
  18.   //当给不可访问或不存在属性赋值时被调用 
  19.   public function __set($name$value
  20.   { 
  21.     echo $name.'-'.$value
  22.     echo '__set called'.PHP_EOL; 
  23.   } 
  24.    
  25.   //读取不可访问或不存在属性时被调用 
  26.   public function __get($name
  27.   { 
  28.     echo $name
  29.     echo '__get called'.PHP_EOL; 
  30.   } 
  31.    
  32.   //调用不可访问或不存在的方法时被调用 
  33.   public function __call($name$arguments
  34.   { 
  35.     echo $name . '-' . implode(','$arguments); 
  36.     echo '__call called'.PHP_EOL; 
  37.   } 
  38.    
  39.   //调用不可访问或不存在的静态方法时被调用 
  40.   public static function __callStatic($name$arguments
  41.   { 
  42.     echo $name . '-' . implode(','$arguments); 
  43.     echo '__callStatic called'.PHP_EOL; 
  44.   } 
  45.    
  46.   //对不可访问或不存在的属性调用isset()或empty()时被调用 
  47.   public function __isset($name
  48.   { 
  49.     echo $name
  50.     echo '__isset called'.PHP_EOL; 
  51.     return true; 
  52.   } 
  53.    
  54.   //对不可访问或不存在的属性进行unset时被调用 
  55.   public function __unset($name
  56.   { 
  57.     echo $name
  58.     echo '__unset called'.PHP_EOL; 
  59.   } 
  60.    
  61.   //serialize时被调用,当你不需要保存大对象的所有数据时很有用 
  62.   public function __sleep() 
  63.   { 
  64.     echo '__sleep called'.PHP_EOL; 
  65.     return array('var1111111111'); 
  66.   } 
  67.    
  68.   //unserialize时被调用,可用于做些对象的初始化操作 
  69.   public function __wakeup() 
  70.   { 
  71.     echo '__wakeup called'.PHP_EOL; 
  72.     $this->var = 'test after wakeup'
  73.   } 
  74.    
  75.   //当一个类被转换成字符串时被调用 
  76.   public function __toString() 
  77.   { 
  78.     return '__toString called'.PHP_EOL; 
  79.   } 
  80.    
  81.   //进行对象clone时被调用,用来调整对象的克隆行为 
  82.   public function __clone() 
  83.   { 
  84.     echo '__clone called'.PHP_EOL; 
  85.   } 
  86.    
  87.   //当以函数方式调用对象时被调用 
  88.   public function __invoke() 
  89.   { 
  90.     echo '__invoke called'.PHP_EOL; 
  91.   } 
  92.    
  93.   //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。 
  94.   public static function __set_state($arr
  95.   { 
  96.     return '__set_state called'.PHP_EOL; 
  97.   } 
  98.    
  99.   //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 
  100.   public function __debuginfo($arr
  101.   { 
  102.     echo '__debuginfo called'.PHP_EOL; 
  103.     return array
  104.       'var' => 'test fro __debuginfo' 
  105.     ); 
  106.   } 
  107.    
  108. $m = new Magic(); //__construct()被调用 
  109. $m->not_exist_property = test; //__set()被调用 
  110. echo $m->not_exist_property;//__get()被调用 
  111. $m->abc(1,2,3); //__call()被调用 
  112. echo isset($m->not_exist_property); //__isset()被调用,返回bool值 
  113. unset($m->not_exist_property); //__unset()被调用 
  114. echo $tmp = serialize($m); //__sleep()被调用 
  115. unserialize($tmp); //__wakeup()被调用 
  116. $m1 = clone $m//__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制 
  117. $m(); //__invoke() 
  118. eval'$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); 
  119. var_dump($m); 
  120. //最后__destruct()被调用 
  121.    
  122. /* 
  123. 结果: 
  124. __construct called 
  125. not_exist_property-test__set called 
  126. not_exist_property__get called 
  127. abc-1,2,3__call called 
  128. not_exist_property__isset called 
  129. 1not_exist_property__unset called 
  130. __sleep called 
  131. O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called 
  132. __destruct called 
  133. __clone called 
  134. __invoke called 
  135. string(20) "__set_state called 
  136. " 
  137. class Magic#1 (1) { 
  138.  public $var => 
  139.  string(4) "test" 
  140. } 
  141. __destruct called 
  142. __destruct called 
  143.    
  144.    
  145. */

Tags: PHP魔术方法

分享到: