PHP魔術法__set和__get
阿新 • • 發佈:2018-01-12
代碼 echo 變量名 外部 解析 定義 說明 rto strong set和get是面向對象中比較常用的2個魔術方法。
? set: 在給不可訪問屬性賦值時,set() 會被調用。語法如下: echo ‘變量‘.$name.‘賦值為:‘.$value.‘<br>‘;
? 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 ?>
代碼解析:
- 調用 $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;
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>‘;
PHP魔術法__set和__get