PHP魔術方法使用總結

魔術方法是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 */
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息