PHP 物件導向 (六)魔術方法

一句話兒發表於2020-01-18

說明:特定情況下,執行的方法

  • 不可訪問的情況

    1. 根本不存在
    2. 許可權不夠
  • 建構函式 __construct()

    作用: 主要用於初始化,變數賦值 或 初始化的相關操作, 例項化物件的時候呼叫

    細節:

    1. 當例項化子類時,子類沒有建構函式,會呼叫父類的建構函式
    2. 當子類想訪問父類可訪問方法時,使用parent::function()或者父類名::function()
  • 解構函式 destruct()

    作用:常用於釋放資源,物件銷燬時呼叫

    細節:多少個物件,檔案執行完畢,就會呼叫多少次解構函式

  • 物件銷燬:

    1. 顯示銷燬
      1. unset($obj)
      2. $obj = null
      3. $obj = 'abc'
    2. 系統銷燬
      1. 當程式執行完畢後,物件被系統銷燬
  • call() 當物件呼叫一個不可訪問的方法的時候,會被呼叫

  • callStatic() 當訪問不可訪問的靜態方法時,呼叫

  • get() 當訪問不可以訪問的屬性時,呼叫

  • set() 當設定不可訪問的屬性時候,呼叫

  • isset() 當對不可訪問的屬性進行了 isset() empty()操作時,呼叫

  • unset() 當對不可訪問的屬性進行了 unset()操作時,呼叫

  • sleep() 序列化的時候用,涉及到序列化

  • wakeup() 反序列化的時候用

  • toString() 當物件被當做字串輸出時,呼叫

  • clone 物件克隆前被呼叫,阻止克隆可以將clone()方法申明為private

<?php
class Student{
    public $class;
    //建構函式,用於初始化
    public function __construct($class)
    {
        echo '呼叫__construct';echo "<br/>";
        $this->class = $class;
    }

    //解構函式,用於釋放資源
    public function __destruct()
    {
        echo '呼叫__destruct';echo "<br/>";
        echo '程式執行結束呼叫';
    }

    //呼叫不可訪問方法時呼叫,使得程式更加健壯,不至於報錯
    public function __call($name, $arguments)
    {
        echo '呼叫__call';echo "<br/>";
        echo $name;echo "<br/>";
        echo "<pre>";var_dump($arguments);echo "</pre>";echo "<br/>";
    }

    //呼叫不可訪問的靜態方法時呼叫
    public static function  __callStatic($name, $arguments)
    {
        echo '呼叫__callStatic';echo "<br/>";
        echo $name;echo "<br/>";
        echo "<pre>";var_dump($arguments);echo "</pre>";echo "<br/>";
    }

    //讀取不可訪問屬性呼叫
    public function __get($name)
    {
        echo '呼叫__get';echo "<br/>";
        echo $name;echo "<br/>";
    }

    //設定不可訪問屬性時呼叫
    public function __set($name, $arguments)
    {
        echo '呼叫__set';echo "<br/>";
        echo $name;echo "<br/>";
        echo "<pre>";var_dump($arguments);echo "</pre>";echo "<br/>";
    }

    //對不可訪問屬性呼叫isset時呼叫
    public function __isset($name)
    {
        echo '呼叫__isset';echo "<br/>";
        echo $name;echo "<br/>";
    }

    //對不可訪問屬性呼叫unset時呼叫
    public function __unset($name)
    {
        echo '呼叫__unset';echo "<br/>";
        echo $name;echo "<br/>";
    }

    //對類物件執行serialize是呼叫
    public function __sleep()
    {
        echo '呼叫__sleep';echo "<br/>";
        return ['class'];
    }

    //對物件執行unserialize時呼叫
    public function __wakeup()
    {
        echo '呼叫__wakeup';echo "<br/>";
    }

    //物件當字串輸出時呼叫
    public function __toString()
    {
        echo '呼叫__stostring';echo "<br/>";
        return 'Student';
    }

    //克隆物件的時候呼叫
    public function __clone()
    {
        echo '呼叫__clone';echo "<br/>";
    }

}

$stu1 = new Student('stu1');

$stu1->getName();//呼叫__call

Student::getName();//呼叫__callStatic

$stu1->height;//呼叫__get

$stu1->height = '175cm';//呼叫__set

isset($stu1->height); //呼叫__isset

empty($stu1->height); //呼叫__isset

unset($stu1->height); //呼叫__unset

$params = serialize($stu1); //呼叫__sleep

echo "<pre>";var_dump($params);echo "</pre>";echo "<br/>";

$obj = unserialize($params); //呼叫__wakeup

echo "<pre>";var_dump($obj);echo "</pre>";echo "<br/>";

$stu2  = clone $stu1; //呼叫__clone

echo $stu1;echo "<br/>";//呼叫__toString

複製程式碼,即可執行。 謝謝你的瀏覽,如有錯誤,歡迎指正哈!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
寫的不好,就當是整理下思緒吧。

相關文章