程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中的魔術方法總結和使用實例

PHP中的魔術方法總結和使用實例

編輯:關於PHP編程

       這篇文章主要介紹了PHP中的魔術方法總結和使用實例,魔術方法是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魔術方法使用實例如下:

      ?

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