1. 什么是PHP重载
PHP是一种动态类型语言,意味着变量在脚本执行时不需要预定义类型,同时函数也可以没有参数类型或返回类型。PHP重载就是在运行时动态创建或改变一个类的属性和方法。
PHP支持两种重载:
属性重载:可以使用魔术方法 __get() 和 __set() 来重载类的属性。
方法重载:可以使用魔术方法 __call() 和 __callStatic() 来重载类的方法。
2. 属性重载
2.1 __get()方法
当读取一个不存在的属性时,__get() 方法就会被调用,通过这个魔术方法可以动态添加一个属性。
class Test{
private $data = ['name' => 'Tom', 'age' => 18];
public function __get($name) {
if (isset($this->data[$name])) {
return $this->data[$name];
}
return null;
}
}
$test = new Test();
echo $test->name; //Tom
echo $test->age; //18
echo $test->gender; //null
__get() 方法接受一个参数 $name,表示访问的属性名。如果该属性不存在,则返回 null。
2.2 __set()方法
当给一个不存在的属性赋值时,__set() 方法会被调用,通过这个魔术方法可以动态添加一个属性和其值。
class Test{
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$test = new Test();
$test->name = 'Tom';
echo $test->name; //Tom
__set() 方法接受两个参数 $name 和 $value,表示要设置的属性名和属性值。
3. 方法重载
3.1 __call()方法
当调用一个不存在的方法时,__call() 方法就会被调用,通过这个魔术方法可以动态添加一个方法。
class Test{
public function __call($name, $arguments) {
if ($name == 'add') {
return array_sum($arguments);
}
return null;
}
}
$test = new Test();
echo $test->add(1,2,3); //6
echo $test->subtract(10,2); //null
__call() 方法接受两个参数 $name 和 $arguments,表示调用的方法名和方法参数。如果该方法不存在,则返回 null。
3.2 __callStatic()方法
当调用一个不存在的静态方法时,__callStatic() 方法就会被调用,通过这个魔术方法可以动态添加一个静态方法。
class Test {
public static function __callStatic($name, $arguments) {
if ($name == 'add') {
return array_sum($arguments);
}
return null;
}
}
echo Test::add(1,2,3); //6
echo Test::subtract(10,2); //null
__callStatic() 方法与 __call() 方法类似,但是只适用于静态方法。