魔術方法是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
PHP魔術方法使用實例以下:html
1 <?php 2 3 class Magic 4 { 5 public $var = 'test'; 6 7 //構造函數,在建立對象的時候調用 8 public function __construct() 9 { 10 echo '__construct called'.PHP_EOL; 11 } 12 13 //某個對象的引用都被刪除、對象被銷燬、調用exit()後、腳本關閉時被調用 14 public function __destruct() 15 { 16 echo '__destruct called'.PHP_EOL; 17 } 18 19 //當給不可訪問或不存在屬性賦值時被調用 20 public function __set($name, $value) 21 { 22 echo $name.'-'.$value; 23 echo '__set called'.PHP_EOL; 24 } 25 26 //讀取不可訪問或不存在屬性時被調用 27 public function __get($name) 28 { 29 echo $name; 30 echo '__get called'.PHP_EOL; 31 } 32 33 //調用不可訪問或不存在的方法時被調用 34 public function __call($name, $arguments) 35 { 36 echo $name . '-' . implode(',', $arguments); 37 echo '__call called'.PHP_EOL; 38 } 39 40 //調用不可訪問或不存在的靜態方法時被調用 41 public static function __callStatic($name, $arguments) 42 { 43 echo $name . '-' . implode(',', $arguments); 44 echo '__callStatic called'.PHP_EOL; 45 } 46 47 //對不可訪問或不存在的屬性調用isset()或empty()時被調用 48 public function __isset($name) 49 { 50 echo $name; 51 echo '__isset called'.PHP_EOL; 52 return true; 53 } 54 55 //對不可訪問或不存在的屬性進行unset時被調用 56 public function __unset($name) 57 { 58 echo $name; 59 echo '__unset called'.PHP_EOL; 60 } 61 62 //serialize時被調用,當你不須要保存大對象的全部數據時頗有用 63 public function __sleep() 64 { 65 echo '__sleep called'.PHP_EOL; 66 return array('var1111111111'); 67 } 68 69 //unserialize時被調用,可用於作些對象的初始化操做 70 public function __wakeup() 71 { 72 echo '__wakeup called'.PHP_EOL; 73 $this->var = 'test after wakeup'; 74 } 75 76 //當一個類被轉換成字符串時被調用 77 public function __toString() 78 { 79 return '__toString called'.PHP_EOL; 80 } 81 82 //進行對象clone時被調用,用來調整對象的克隆行爲 83 public function __clone() 84 { 85 echo '__clone called'.PHP_EOL; 86 } 87 88 //當以函數方式調用對象時被調用 89 public function __invoke() 90 { 91 echo '__invoke called'.PHP_EOL; 92 } 93 94 //當調用var_export()導出類時,此靜態方法被調用。用__set_state的返回值作爲var_export的返回值。 95 public static function __set_state($arr) 96 { 97 return '__set_state called'.PHP_EOL; 98 } 99 100 //當調用var_dump()打印對象時被調用(當你不想打印全部屬性)適用於PHP5.6版本 101 public function __debuginfo($arr) 102 { 103 echo '__debuginfo called'.PHP_EOL; 104 return array( 105 'var' => 'test fro __debuginfo' 106 ); 107 } 108 } 109 110 $m = new Magic(); //__construct()被調用 111 $m->not_exist_property = test; //__set()被調用 112 echo $m->not_exist_property;//__get()被調用 113 $m->abc(1,2,3); //__call()被調用 114 echo isset($m->not_exist_property); //__isset()被調用,返回bool值 115 unset($m->not_exist_property); //__unset()被調用 116 echo $tmp = serialize($m); //__sleep()被調用 117 unserialize($tmp); //__wakeup()被調用 118 $m1 = clone $m; //__clone()被調用,對象默認是引用傳遞,使用clone關鍵詞則可實現對象複製 119 $m(); //__invoke() 120 eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); 121 var_dump($m); 122 //最後__destruct()被調用 123 124 /* 125 結果: 126 __construct called 127 not_exist_property-test__set called 128 not_exist_property__get called 129 abc-1,2,3__call called 130 not_exist_property__isset called 131 1not_exist_property__unset called 132 __sleep called 133 O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called 134 __destruct called 135 __clone called 136 __invoke called 137 string(20) "__set_state called 138 " 139 class Magic#1 (1) { 140 public $var => 141 string(4) "test" 142 } 143 __destruct called 144 __destruct called 145 146 147 */