## 重载(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防御