7.11 重载

PHP中的重载是指 动态的创建属性或方法,传统的重载是指定义多个参数不同的同名方法。

当实例调用对象中不存在的属性或方法时,PHP会先去该对象中寻找对应的魔术方法进行处理,如果处理不成功,则抛出异常,而此时的魔术方法,其实就是重载方法。

需要注意的是,这些重载方法必须是公开的,而且参数不能为引用传递。

最基本的例子是对象属性的读取和赋值。

__set:当给对象中不存在的属性进行赋值时调用
__get:当访问对象中不存在的属性时进行调用

// 定义类
class Example{
    // 公共属性
    public $property = [];
    // 设置属性
    public function __set($name, $value){
        echo "

__set:

"; $this->property[$name] = $value; } // 获取属性 public function __get($name){ echo "

__get:

"; return isset($this->property[$name]) ? $this->property[$name] : NULL; } } // 实例化 $exam = new Example(); // 打印属性、返回 NULL echo $exam->name . "
"; // 属性赋值 $exam->name = 10; // 访问属性、返回 10 echo $exam->name . "
"; /* 最终输出 __get: __set: __get: 10 */

对一个属性进行判断的时候,也可以使用重载方法。

__isset:当对一个不存在的属性进行 isset()判断时调用
__empty:同上,但最好配合__get一起使用

// 定义类
class Example{
    public $property = ['foo' => 123, 'bar' => 'abc'];
    public function __get($name){
        echo "

__get: $name

"; return $this->property[$name] ? $this->property[$name] : NULL; } public function __isset($name){ echo "

__isset: $name

"; 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 "
"; // 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 "

__unset: $name

"; 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(): 
"; var_dump($arguments); echo "
"; } // 静态方法重载 public static function __callStatic(string $name, array $arguments){ echo "static function $name():
"; var_dump($arguments); echo "
"; } } // 实例化 $exam = new Example(); // 调用不存在的普通方法 $exam->fn1(123, '456'); // 调用不存在的静态方法 Example::fn2(123, '456');

你可能感兴趣的:(7.11 重载)