7.13 魔術(shù)方法

在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);
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绍哎,一起剝皮案震驚了整個濱河市来农,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崇堰,老刑警劉巖沃于,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異海诲,居然都是意外死亡繁莹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門饿肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋困,“玉大人,你說我怎么就攤上這事敬辣⊙┍辏” “怎么了零院?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長村刨。 經(jīng)常有香客問我告抄,道長,這世上最難降的妖魔是什么嵌牺? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任打洼,我火速辦了婚禮,結(jié)果婚禮上逆粹,老公的妹妹穿的比我還像新娘募疮。我一直安慰自己,他們只是感情好僻弹,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布阿浓。 她就那樣靜靜地躺著,像睡著了一般蹋绽。 火紅的嫁衣襯著肌膚如雪芭毙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天卸耘,我揣著相機與錄音退敦,去河邊找鬼。 笑死蚣抗,一個胖子當著我的面吹牛侈百,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忠聚,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼设哗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了两蟀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤震缭,失蹤者是張志新(化名)和其女友劉穎赂毯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拣宰,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡党涕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巡社。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膛堤。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晌该,靈堂內(nèi)的尸體忽然破棺而出肥荔,到底是詐尸還是另有隱情绿渣,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布燕耿,位于F島的核電站中符,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誉帅。R本人自食惡果不足惜淀散,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚜锨。 院中可真熱鬧档插,春花似錦、人聲如沸亚再。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽针余。三九已至饲鄙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圆雁,已是汗流浹背忍级。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伪朽,地道東北人轴咱。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像烈涮,于是被迫代替她去往敵國和親朴肺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容