PHP中的重載是指 動態的創建屬性或方法,傳統的重載是指定義多個參數不同的同名方法。
當實例調用對象中不存在的屬性或方法時,PHP會先去該對象中尋找對應的魔術方法進行處理,如果處理不成功,則拋出異常,而此時的魔術方法,其實就是重載方法。
需要注意的是,這些重載方法必須是公開的,而且參數不能為引用傳遞。
最基本的例子是對象屬性的讀取和賦值。
__set
:當給對象中不存在的屬性進行賦值時調用
__get
:當訪問對象中不存在的屬性時進行調用
// 定義類
class Example{
// 公共屬性
public $property = [];
// 設置屬性
public function __set($name, $value){
echo "<p>__set: </p>";
$this->property[$name] = $value;
}
// 獲取屬性
public function __get($name){
echo "<p>__get: </p>";
return isset($this->property[$name]) ? $this->property[$name] : NULL;
}
}
// 實例化
$exam = new Example();
// 打印屬性、返回 NULL
echo $exam->name . "<br />";
// 屬性賦值
$exam->name = 10;
// 訪問屬性、返回 10
echo $exam->name . "<br />";
/*
最終輸出
__get:
__set:
__get:
10
*/
對一個屬性進行判斷的時候,也可以使用重載方法。
__isset
:當對一個不存在的屬性進行 isset()
判斷時調用
__empty
:同上,但最好配合__get
一起使用
// 定義類
class Example{
public $property = ['foo' => 123, 'bar' => 'abc'];
public function __get($name){
echo "<p>__get: $name</p>";
return $this->property[$name] ? $this->property[$name] : NULL;
}
public function __isset($name){
echo "<p>__isset: $name</p>";
return isset($this->property[$name]);
}
}
// 實例化
$exam = new Example();
// isset
var_dump(isset($exam->property));
var_dump(isset($exam->foo));
var_dump(isset($exam->abc));
echo "<hr />";
// empty
var_dump(empty($exam->property));
var_dump(empty($exam->bar));
var_dump(empty($exam->abc));
/*
最終輸出:
bool(true)
__isset: foo
bool(true)
__isset: abc
bool(false)
bool(false)
__isset: bar
__get: bar
bool(false)
__isset: abc
bool(true)
*/
刪除一個屬性的時候
__unset
:試圖刪除一個不存在的屬性時調用
// 定義類
class Example{
public $property = ['foo' => 123, 'bar' => 'abc'];
public function __unset($name){
echo "<p>__unset: $name</p>";
unset($this->property[$name]);
}
}
// 實例化
$exam = new Example();
// unset
unset($exam->foo);
unset($exam->abc);
// 結果
var_dump($exam->property);
/*
最終輸出:
__unset: foo
__unset: abc
array(1) { ["bar"]=> string(3) "abc" }
*/
類的方法也可以通過重載來訪問
// 定義類
class Example{
// 普通方法重載
public function __call(string $name, array $arguments){
echo "function $name(): <br />";
var_dump($arguments);
echo "<br />";
}
// 靜態方法重載
public static function __callStatic(string $name, array $arguments){
echo "static function $name(): <br />";
var_dump($arguments);
echo "<br />";
}
}
// 實例化
$exam = new Example();
// 調用不存在的普通方法
$exam->fn1(123, '456');
// 調用不存在的靜態方法
Example::fn2(123, '456');