複製鏈接
請複製以下鏈接發送給好友

魔術方法

鎖定
魔術方法指的是在 PHP 中以兩個下劃線開頭的方法,__construct( ), __destruct ( ), __call( ), __callStatic( ),__get( ), __set( ), __isset( ), __unset ( ), __sleep( ), __wakeup( ), __toString( ), __set_state,( ) __clone( ) __autoload( )等。
中文名
魔術方法
適用領域
PHP領域
所屬學科
計算機
定    義
在 PHP 中以兩個下劃線開頭的方法

目錄

魔術方法集合涵義

如果希望PHP調用這些魔術方法,首先必須在類中定義,否則PHP不會執行未創建的魔術方法。 [1] 
注意:PHP 將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法。所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為前綴

魔術方法包含成員

魔術方法__set

簡介
當程序試圖寫入一個不存在或者不可見的成員變量時,PHP就會執行__set( )方法。__set( )方法包含兩個參數,分別表示變量名稱和變量值,兩個參數都不可省略。 [2] 
實例1:
<?php
class SportObject{
    private $type='';
    public function __get($name){
        if(isset($this->$name)){
            echo'變量'.$name.'的值為:'.$this->$name.'<br>';
        }else{
            echo'變量'.$name.'未定義,初始化為0<br>';
            $this->$name=0;
        }
    }
    public function __set($name,$value){
        if(isset($this->$name)){
            $this->$name=$value;
            echo'變量'.$name.'賦值為:'.$value.'<br>';
        }else{
            $this->$name=$value;
            echo'變量'.$name.'被初始化為:'.$value.'<br>';
        }
    }
}
    $MyComputer=newSportObject();
    $MyComputer->type='DIY';
    $MyComputer->type;
?>
例1輸出結果為:
變量type賦值為:DIY
變量type的值為:DIY

魔術方法__get

簡介:
當程序試圖調用一個未定義或不可見的成員變量時,可以通過__get( )方法來讀取變量值。__get( )方法有一個參數,表示要調用的變量名。 [2] 
實例2:
<?php
class SportObject{
    private $type='';
    public function__get($name){
        if(isset($this->$name)){
            echo'變量'.$name.'的值為:'.$this->$name.'<br>';
        }else{
            echo'變量'.$name.'未定義,初始化為0<br>';
            $this->$name=0;
        }
    }
    public function __set($name,$value){
        if(isset($this->$name)){
            $this->$name=$value;
            echo'變量'.$name.'賦值為:'.$value.'<br>';
        }else{
            $this->$name=$value;
            echo'變量'.$name.'被初始化為:'.$value.'<br>';
        }
    }
}
    $MyComputer=newSportObject();
    $MyComputer->name;
?>
例2輸出結果為:
變量name未定義,初始化為0
變量name被初始化為:0
__construct( ),__destruct( )
簡介:
- 在每次創建新對象時先調用此方法
-對象的所有引用都被刪除或者當對象被顯式銷燬時執行
實例3:
<?php
/**
 * 清晰的認識__construct() __destruct
 */
class Example {
    public static $link;
    //在類實例化的時候自動加載__construct這個方法
    public function __construct($localhost, $username, $password, $db) {
        self::$link = mysql_connect($localhost, $username, $password);
        if (mysql_errno()) {
            die('錯誤:' . mysql_error());
        }
        mysql_set_charset('utf8');
        mysql_select_db($db);
    } 
    /**
     * 通過__construct鏈接好數據庫然後執行sql語句......
     */  
    //當類需要被刪除或者銷燬這個類的時候自動加載__destruct這個方法
    public function __destruct() {
        echo '<pre>';
        var_dump(self::$link);
        mysql_close(self::$link);
        var_dump(self::$link);
    }
}
$mysql = new Example('localhost', 'root', 'root', 'test');
例3輸出結果為:
resource(2) of type (mysql link)
resource(2) of type (Unknown)
參考資料
  • 1.    PHP手冊  .PHP官網[引用日期2014-03-20]
  • 2.    潘凱華,劉中華.PHP從入門到精通(第二版):清華大學出版社,2010年7月