🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 重载(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'); ?> ```