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