PHP是一種動態類型語言,意味著變量在腳本執行時不需要預定義類型,同時函數也可以沒有參數類型或返回類型。 PHP重載指的是在運行時動態創建或修改類的屬性和方法。
PHP支持兩種主要的重載形式:
1. 屬性重載:通過魔術方法__get()和__set() ,可以動態地訪問或設置類的屬性。
2. 方法重載:通過魔術方法__call()和__callStatic() ,可以動態地調用類的方法。
當訪問一個不存在的屬性時, __get()方法會被調用。通過該魔術方法,可以動態添加屬性。
class Test {
private $data = [
'name' => 'Tom',
'age' => 18
];
public function __get($name) {
if (isset($this->data[$name])) {
return $this->data[$name];
}
return null;
}
}
$test = new Test();
echo $test->name; // 輸出 Tom
echo $test->age; // 輸出 18
echo $test->gender; // 輸出 null
__get()方法接受一個參數$name ,即屬性名。如果該屬性不存在,則返回null 。
當給一個不存在的屬性賦值時, __set()方法會被觸發。通過該魔術方法,可以動態地添加一個屬性及其值。
class Test {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$test = new Test();
$test->name = 'Tom';
echo $test->name; // 輸出 Tom
__set()方法接受兩個參數: $name (屬性名)和$value (屬性值)。
當調用一個不存在的方法時, __call()方法會被調用。通過該魔術方法,可以動態地添加方法。
class Test {
public function __call($name, $arguments) {
if ($name == 'add') {
return array_sum($arguments);
}
return null;
}
}
$test = new Test();
echo $test->add(1, 2, 3); // 輸出 6
echo $test->subtract(10, 2); // 輸出 null
__call()方法接受兩個參數: $name (方法名)和$arguments (方法參數)。如果該方法不存在,則返回null 。
當調用一個不存在的靜態方法時, __callStatic()方法會被調用。該方法與__call()方法類似,只不過它用於靜態方法。
class Test {
public static function __callStatic($name, $arguments) {
if ($name == 'add') {
return array_sum($arguments);
}
return null;
}
}
echo Test::add(1, 2, 3); // 輸出 6
echo Test::subtract(10, 2); // 輸出 null
__callStatic()方法與__call()方法類似,但只適用於靜態方法。