PHP魔術法__set和__get

set和get是面向對象中比較常用的2個魔術方法。
set: 在給不可訪問屬性賦值時,set() 會被調用。語法如下:

public void __set ( string $name , mixed $value )

get: 讀取不可訪問屬性的值時,get() 會被調用。語法如下:

public mixed __get ( string $name )

說明: 參數 $name 是指要操作的變量名稱。__set() 方法的 $value 參數指定了 $name 變量的值。
示例代碼如下:

<?php
class SportObject{                                          //類SportObject
private $type = ' ';                                        //私有變量$type
public function __get($name){                               //聲明魔術方法__get()
        echo "調用__get方法\n";
        if(isset($this ->$name)){                               //判斷變量是否被聲明
            echo '變量'.$name.'的值爲:'.$this -> $name.'<br>';
        }else{
            echo '變量'.$name.'未定義,初始化爲0<br>'; 
            $this -> $name = 0;                             //如果未被聲明,則對變量初始化
        }
    }
    public function __set($name, $value){                       //聲明魔術方法__set()
        echo "調用__set方法\n";
        if(isset($this -> $name)){                              //判斷變量是否定義
            $this -> $name = $value;
            echo '變量'.$name.'賦值爲:'.$value.'<br>';
        }else{
            $this -> $name = $value;                            //如果未定義,繼續對變量進行賦值
            echo '變量'.$name.'被初始化爲:'.$value.'<br>';     //輸出警告信息
        }
    }
    public function test()
    {
        echo $this->type;
    }

}
$MyComputer = new SportObject();                                //實例化對象$MyComputer
$MyComputer -> type = 'DIY';                                    //給變量賦值  
$MyComputer -> type;                                        //調用變量$type
$MyComputer -> cpu;                                        //調用變量$name

?>

代碼解析:

  1. 調用 $MyComputer -> type = 'DIY'; 爲type屬性賦值,由於type屬性是private,不能在類外部訪問,所以會調用set()魔術方法,首先判斷if語句中的isset($this->$name),根據set($name,$value)的語法,我們知道$name的值是type,$value的值是DIY,isset($this->$name)即是isset($this->type),前面提到type這個屬性是private,但是在類內部是可以調用的, 所以if語句成立,執行下面代碼:

$this->$name = $value;
echo '變量'.$name.'賦值爲:'.$value.'<br>';

2.  調用$MyComputer->type, 是讀取type屬性,同理,執行__get($name)方法。首先判斷isset($this->$name),if語句成立,執行下面代碼:

echo '變量'.$name.'的值爲:'.$this -> $name.'<br>';
由於前面已經爲$this->type賦值爲DIY,所以直接輸出。

3.  調用$MyComputer -> cpu; 讀取cpu這個不存在屬性,調用__get($name)方法,首先判斷if語句isset($this->$name),由於沒有這個cup屬性,所以執行else語句內容,代碼如下:

echo '變量'.$name.'未定義,初始化爲0<br>';
$this -> $name = 0;

在代碼最後,調用了$this->$name = 0; 即爲不存在的屬性賦值,所以會再次調用__set($name)方法。同樣是判斷if語句,這時if語句爲false,執行else中的代碼如下:

$this -> $name = $value;
echo '變量'.$name.'被初始化爲:'.$value.'<br>';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章