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
?>
代碼解析:
- 調用 $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>';