在PHP中內(nèi)置了很多以__
兩個下劃線開頭命名的方法戏锹,這些稱之為魔術(shù)方法冠胯。
-
__sleep
可以在使用serialize()
序列化之前,指明會被序列化的屬性锦针,例如某個對象中的數(shù)據(jù)很大荠察,但是只需要用到其中一部分,那么就可以用到__sleep
了奈搜。// 定義類 class Example{ // 私有屬性 private $foo = [1, 2, 3]; private $bar = ['aa', 'bbb', 'cccc']; // 在序列化之前調(diào)用 public function __sleep(){ // 只序列化 bar 屬性 return ["bar"]; } } // 實例化 $exam = new Example(); // O:7:"Example":1:{s:12:"Examplebar";a:3: {i:0;s:2:"aa";i:1;s:3:"bbb";i:2;s:4:"cccc";}} echo serialize($exam); // 如果沒有 __sleep 輸出的是: // O:7:"Example":2:{s:12:"Examplefoo";a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}s:12:"Examplebar";a:3:{i:0;s:2:"aa";i:1;s:3:"bbb";i:2;s:4:"cccc";}}
-
__wakeup
在使用unserialize()
反序列化之前調(diào)用悉盆,可以預先執(zhí)行一些準備操作,即便__sleep()
指明了僅序列化部分數(shù)據(jù)馋吗,但反序列后仍然能獲取所有數(shù)據(jù)焕盟。// 定義類 class Example{ // 私有屬性 private $foo = [1, 2, 3]; private $bar = []; // 構(gòu)造函數(shù) public function __construct(array $array){ $this->bar = $array; } // 在序列化之前調(diào)用 public function __sleep(){ // 只序列化 bar 屬性 return ["bar"]; } // 在反序列化之前調(diào)用 public function __wakeup(){ echo '<br />'; } } // 實例化 $exam = new Example(['a', 'b', 'c']); // 序列化 // string(80) "O:7:"Example":1:{s:12:"Examplebar";a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}}" $data = serialize($exam); var_dump($data); // 返序列化 // object(Example)#2 (2) { ["foo":"Example":private]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["bar":"Example":private]=> array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } } var_dump(unserialize($data));
-
__toString
當一個對象在執(zhí)行字符串操作時應該返回什么值
// 定義類 class Example{ // 字符串形態(tài) public function __toString(){ return 'hello world'; } } // 實例化 $exam = new Example(['a', 'b', 'c']); // hello world echo $exam;
-
__invoke
以函數(shù)形式調(diào)用已實例化的對象時,會執(zhí)行該方法
// 定義類 class Example{ // 函數(shù)式調(diào)用 public function __invoke(string $str){ return $str; } } // 實例化 $exam = new Example(); // hello world echo $exam('hello world');
-
__set_state
執(zhí)行var_export()
時調(diào)用宏粤,該函數(shù)根據(jù)調(diào)用時第二個參數(shù)的值來決定輸出或返回一個字符串形式的變量脚翘。// 定義類 class Example{ // 我的屬性 private $foo = 123; private $bar = 'abc'; // var_export public static function __set_state(array $arr){ return 'hello world'; } } // 實例化 $exam = new Example(); // Example::__set_state(array( 'foo' => 123, 'bar' => 'abc', )) var_export($exam, false);
-
__debugInfo
執(zhí)行var_dump()
時,返回該對象的屬性集合// 定義類 class Example{ // 我的屬性 private $foo = 123; private $bar = 'abc'; // var_dump public function __debugInfo(){ return [ 'foo' => $this->foo, 'bar' => $this->bar . ' test', ]; } } // 實例化 $exam = new Example(); // object(Example)#1 (2) { ["foo"]=> int(123) ["bar"]=> string(8) "abc test" } var_dump($exam);