PHP学习笔记3——重载

mac2026-06-19  1

PHP学习笔记3——重载和魔术方法

重载的概念属性重载1. __get()2. __set()3. __isset()4.__unset() 方法重载1. __call()2. __callStatic()

重载的概念

在其他编程语言中,面向对象的重载是指。方法有相同名称,但是参数列表不相同的情形,但PHP不支持同名函数或同名方法。PHP所提供的“重载”(overloading)是指动态地“创建”属性和方法,通过魔术方法来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有重载方法都必须被声明为public属性重载只能在对象中进行。在静态方法中,这些魔术方法将不能被声明为static。

属性重载

使用魔术方法

1. __get()

描述:读取不可访问属性的值时,__get()会被调用。 语法:public mixed__get(string name)

例子代码:

<?php class Student { //私有的成员属性 private $name="张三"; private $age=21; //当访问不可访问属性值时,__get()魔术方法会自动调用 public function __get($n) { return $this->$n; } } //创建学生类对象 $obj=new Student(); //访问私有属性 echo "{$obj->name}的年龄是{$obj->age}岁。";

2. __set()

描述:再给不可访问属性赋值时,__set()会被调用。 语法:public void__set(string $name,mixed $value)

例子代码:

//当给不可访问属性赋值时,__set()方法会自动调用 public function __set($n,$v) { $this->$n=$v; } //修改私有属性 $obj->name="李四"; $obj->age=20;

3. __isset()

描述:在给不可访问属性调用isset()或empty()时,__isset()会被调用。 语法:public bool __isset(string $name)

例子代码:

//当对不可访问属性应用isset()或empty()时。__isset()会自动调用 public function __isset($n) { return isset($this->$n); } //判断私有属性是否存在 if(isset($obj->name)) { echo "存在"; }else { echo "不存在或不可访问"; }

4.__unset()

描述:当对不可访问属性调用unset时,__unset()会自动调用。 语法:public void__unset(string $name)

例子代码:

//当对私有属性调用unset时,__unset()会自动调用 public function __unset($n) { unset($this->$n); } //删除对象属性 unset($obj->name);

方法重载

使用魔术方法

1. __call()

描述:在对象调用一个不可访问方法时,__call()会被调用。 语法:public mixed__call(string $name,array $arguments)

代码例子:

//当访问一个不存在或不可访问方法时,__call()会被调用 //参数:$func是传递过来的方法名称,$args是传递过来的参数数组 public function __call($func,$args) { echo "方法{$func}(".implode(',', $args).")不存在或不可访问!"; } //调用一个不存在的方法 $obj->showInfo("张三",21);

2. __callStatic()

描述:用静态方法调用一个不可访问方法时,__callStatic()会被调用。 语法:public static mixed __callStatic (string $name,array $arguments)

代码例子:

//用静态方法调用一个不存在或不可访问方法时,__callStatic()会被调用 //参数:$func是传递过来的方法名称,$args是传递过来的参数数组 public static function __callStatic($func,$args) { echo "static方法{$func}(".implode(',', $args).")不存在或不可访问!"; } //用静态化方式调用showInfo方法 Student::showInfo();
最新回复(0)