get() set() isset() 和 unset()
每當你嘗試從類中檢索某個欄位時,如下所示:
$animal = new Animal();
$height = $animal->height;
PHP 呼叫魔術方法 __get($name)
,在這種情況下 $name
等於 height
。寫入類欄位如下:
$animal->height = 10;
將呼叫魔法 __set($name, $value)
,$name
等於 height
,$value
等於 10
。
PHP 還有兩個內建函式 isset()
,用於檢查變數是否存在,unset()
用於銷燬變數。檢查物件欄位是否設定如下:
isset($animal->height);
將在該物件上呼叫 __isset($name)
函式。像這樣銷燬變數:
unset($animal->height);
將在該物件上呼叫 __unset($name)
函式。
通常,當你沒有在類上定義這些方法時,PHP 只會檢索儲存在類中的欄位。但是,你可以覆蓋這些方法來建立可以像陣列一樣儲存資料的類,但是可以像物件一樣使用:
class Example {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
if (!array_key_exists($name, $this->data)) {
return null;
}
return $this->data[$name];
}
public function __isset($name) {
return isset($this->data[$name]);
}
public function __unset($name) {
unset($this->data[$name]);
}
}
$example = new Example();
// Stores 'a' in the $data array with value 15
$example->a = 15;
// Retrieves array key 'a' from the $data array
echo $example->a; // prints 15
// Attempt to retrieve non-existent key from the array returns null
echo $example->b; // prints nothing
// If __isset('a') returns true, then call __unset('a')
if (isset($example->a)) {
unset($example->a));
}
empty()
函式和魔術方法
請注意,呼叫 empty()
上一個類屬性將呼叫 __isset()
因為 PHP 手冊狀態:
empty()
基本上是 !isset($ var)|| 的簡潔等價物 $ var == false