在面向对象的编程中,重载指的是不同函数使用相同的函数名,但是参数的类型和个数不同。而在PHP中,重载的是当对一个对象或类使用其未定义或者不可访问的属性或方法的时候,调用对应的魔术方法,是对错误的特殊处理机制。
PHP的重载分为属性重载和方法重载。
属性重载:
<?php
class man{
private $age = 10;
public function __get($key){
echo '__get::' . $key,'<br />';
}
public function __set($key,$value){
echo '__set::' . $key,$value,'<br />';
}
public function __isset($key){
echo '__isset::' . $key,'<br />';
}
public function __unset($key){
echo '__unset::' . $key,'<br />';
}
public function __toString(){
echo '__toString::<br />' ;
return 'false';
}
}
$man = new man();
echo $man->age;
$man->age = 18;
isset($man->age);
unset($man->age);
echo $man;
我们来看一下浏览器的输出结果:
方法重载:
<?php
class woman{
private static function callstatic(){
echo __METHOD__;
}
public function __call($funcname,$args){
echo __METHOD__,'<br />';
return false;
}
public static function __callStatic($funcname,$args){
echo __METHOD__,'<br />';
return false;
}
}
woman::callstatic();
$woman = new woman();
$woman->show();
我们来看一下浏览器的输出结果:
我们看到,在调用未定义或者不可访问属性和方法,本来会发生错误,但是在我们定义了一些魔术方法之后,此时会调用魔术方法,这个就叫做PHP的重载。
其实,我们可以更加充分的利用这一特殊处理机制,比如在类外访问不可访问属性,可以通过对应的魔术法来进行属性的访问。
<?php
class man{
private $age = 10;
public function __get($key){
return "$key:" . $this->$key;
}
}
$man = new man();
echo $man->age;
浏览器输出:
这样一来,我们就实现了访问不可访问属性,虽然这有风险,但也是PHP重载的扩展应用。