## 重載(overloading)
PHP所提供的 "重載" 是指動態地 "創建" 類屬性和方法。我們是通過魔術方法(magic methods)來實現的。
當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。
本節后面將使用 "不可訪問屬性" 和 "不可訪問方法" 來稱呼這些未定義或不可見的類屬性或方法。
所有的重載方法都必須被聲明為 `public`
> **Note:** PHP 中的 "重載" 與其它絕大多數面向對象語言不同。傳統的"重載"是用于提供多個同名的類方法,但各方法的參數類型和個數不同。
### 屬性的重載
```
public void __set(string $name, mixed $value)
public mixed __get(string $name)
public bool __isset(string $name)
public void __unset(string $name)
```
* 在給不可訪問屬性賦值時,`__set()` 會被調用。
* 讀取不可訪問屬性的值時,`__get()` 會被調用。
* 當對不可訪問屬性調用 `isset()` 或 `empty()` 時,`__isset()` 會被調用。
* 當對不可訪問屬性調用 `unset()` 時,`__unset()` 會被調用。
```
<?php
class MyClass
{
private $data = array();
public function __set($key, $val)
{
$this->data[$key] = $val;
}
public function __get($key)
{
if (isset($this->data[$key])) {
return $this->data[$key];
}
return null;
}
public function __isset($key)
{
if (isset($this->data[$key])) {
return true;
}
return false;
}
public function __unset($key)
{
unset($this->data[$key]);
}
}
$obj = new MyClass();
$obj->name = 'kate green';
echo "{$obj->name}" . PHP_EOL;
?>
```
### 方法重載
```
public mixed __call(string $name, array $arguments)
public static mixed __callStatic(string $name , array $arguments)
```
* 在對象中調用一個不可訪問方法時,`__call()` 會被調用。
* 在靜態上下文中調用一個不可訪問方法時,`__callStatic()` 會被調用。
```
<?php
class MyClass
{
public function __call($name, $arguments)
{
echo "Calling object method '{$name}' " . implode(', ', $arguments). PHP_EOL;
}
public static function __callStatic($name, $arguments)
{
echo "Calling static method '{$name}' " . implode(', ', $arguments). PHP_EOL;
}
}
$obj = new MyClass();
$obj->run('in object context');
MyClass::run('in static context');
?>
```
- 基本語法
- PHP標記
- 指令分隔符
- 從HTML中分離
- 注釋
- 數據類型
- 布爾值
- 整數
- 浮點數
- 字符串
- 數組
- 對象
- 資源
- 空值
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 常量
- 常量語法
- 魔術常量
- 運算符
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 遞增與遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if條件結構
- switch條件結構
- while循環結構
- do-while循環結構
- for循環結構
- foreach循環結構
- 包含文件
- 函數
- 自定義函數
- 可變函數
- 匿名函數
- 遞歸函數
- 類與對象
- 基本概念
- 屬性
- 方法
- 類常量
- 構造函數和析構函數
- 訪問控制
- 繼承
- 抽象類
- 接口
- Trait
- 重載
- 對象遍歷
- 魔術方法
- Final關鍵字
- 命名空間
- 自動加載
- 錯誤處理
- 錯誤顯示
- 錯誤日志
- 錯誤報告
- 自定義錯誤處理
- 異常處理
- 異常處理機制
- 擴展異常處理類
- 字符操作
- 數組操作
- 時間操作
- 表單操作
- GET提交
- POST提交
- 文件上傳
- 會話控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件屬性
- 讀取文件
- 寫入文件
- 文件管理
- 文件鎖
- 目錄處理
- 路徑處理
- 網絡操作
- HTTP協議
- Socket操作
- CURL操作
- PDO操作
- 介紹
- 連接管理
- 預處理語句
- 事務處理
- 錯誤處理
- 圖像操作
- 正則表達式
- 標準推薦
- 包管理器
- 設計模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御