php中常用到的魔術方法

來源:互聯網
上載者:User

標籤:size   運行   new   bsp   另一個   解構函式   clu   常用   set   

PHP物件導向中有很多功能很強大,不得不說的就是魔術方法了。今天抽出時間記錄幾個比較常用的魔術方法:

1.__construct 這是建構函式,指當一個類被執行個體化的時候就會自動調用的函數。那我們可以在這裡初始設定變數的值。例如: 

class Score{    public $chinese;    public $english;    public $math;    public function __construct($chinese=100,$english=99,$math=98)    {        $this->chinese=$chinese;        $this->english=$english;        $this->math=$math;    }    public function show(){        echo "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";    }

這個時候,我們可以執行個體化一個Score對象出來,接著調用Score類的show方法,例如:

$stu = new Score();$stu->show();

我們執行個體化一個對象,沒有傳值,這個時候列印出來就是

chinese:100,english:99,math:98

2.__destruct 解構函式。顧名思義,他的作用和建構函式是對立的,當對象被銷毀時,析構方法會運行,或者明確的說當我們不再使用它時,php會為我們清理掉。

public  function __destruct()    {        echo "我被摧毀了{$this->math}"; 
}

3.__set ()賦值,給屬性賦值,接著用另一個魔術方法__get()來取值

class User{    private $name;    private $age;    /*****__set():賦值****/    function __set($name,$value)    {        if($name == "age"){            if($value <18){                $this->age = 18;            }else{                $this->age = $value;            }        }else{            $this->$name = $value;        }    }}

4.__get();取值,當__set()方法給某些屬性賦值之後,這時候可以用__get()取賦值之後的任意屬性,方法如下:

class User{    private $name;    private $age;     /****__get():取值***/    function __get($name)    {        if($name == "name"){            return "dog";        }else{            return $this->$name;        }    }}

5.__isset();判斷是否是這個屬性;噹噹前屬性被isset()或者empty(),即當某個屬性被檢驗空的方法調用的時候,會觸發這個方法

class User{    private $name;    private $age;    public function __isset($name)    {        echo "{$name}isset被調用了";    }}

調用方法如下:

$user = new User();$user->name = "房明";isset($user->name); 

 6.__unset();銷毀這某個屬性;

class User{    private $name;    private $age;      function __unset($name)    {        echo "{$name}被銷毀了";        //防止被銷毀的時候直接寫一個return即可;    }}

調用方法如下:

$user = new User();$user->name = "房明";unset($user->name);

7.__clone():複製的時候會調用__clone方法;

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }     //複製的時候會調用__clone方法    public function __clone()    {        $this->age = 0;    }    }

調用方法如下:

$four = new Four("zhq",18);$four2 = clone $four; //此時的$four2調用的是__clone方法,所以此時年齡會變為0

8.__call:當類裡面沒有方法的時候會調用__call方法;

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }     //當類裡面沒有方法的時候會調用__call方法    function __call($name, $arguments)    {        echo "沒有{$name}這個方法,不能這麼玩";    }    }

調用方法如下:

$four = new Four("zhq",18);$four ->show();//類中沒有這個方法,就會調用__call方法

9.__tostring();當echo的時候會調用__toString方法;

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }    //當echo的時候會調用__toString方法;      $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";        return $stu;    }

調用方法如下:

$four = new Four("zhq",18);echo $four;echo 執行個體化出來的時候,就直接調用tostring方法

10.__autoload:自動載入,當類路徑找不到的時候會調用__autoload方法,這個方法很好的解決了需要引用多個include_once的問題;

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }    //當echo的時候會調用__toString方法;      $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";        return $stu;    }

若在另一個頁面調用Four類;不需要再用include_once Four;為了避免代碼重複,則有以下方法

function __autoload($name){    $path = $name.".class.php";    include_once $path;}//這個時候不需要引入Four類,這就可以直接執行個體化一個對象

11.__sleep():當對象被序列化那一瞬間調用這個函數

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }    //當對象被序列化那一瞬間    function  __sleep()    {      // TODO: Implement __sleep() method.      echo "我要睡著了<br>";      return array(‘name‘,‘age‘);    }}

這個時候我們可以將對象進行序列化的時候,就調用了__sleep()方法;

$four = new Four("zhq",18);
//將對象進行序列化$four1=serialize($four);
//將檔案寫入字串file_put_contents("score.txt",$four1);

12.__wakeup():將對象進行反序列化的時候調用這個函數

class Four{    public $name;    public $age;    public function __construct($name,$age)    {        $this->name = $name;        $this->age = $age;    }     //當對象被反序列化那一瞬間    public function __wakeup()    {        echo "我又回來了<br>";        // TODO: Implement __wakeup() method.    }  }

這個時候我們可以將對象進行反序列化的時候,就調用了__wakeup()方法;

//讀取檔案$four= file_get_contents("score.txt");$obj = unserialize($four);

目前先記錄這些基本的魔術方法,不知道有沒有錯誤,希望大家來指正,虛心學習,積累知識!謝謝,以後還會在增加其他的魔術方法。

 

 

php中常用到的魔術方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.