重载的基本概念:
重载在通常的“面向对象的语言”中的含义:是指在一个类(或对象)中,有多个名字相同但是形参不同的方法的现象;
如:class A{
function f1(){}
function f2($p1){}
function f3($p1,$p2){}
}
但是,重载在“PHP语言”中的含义有些不同:
“PHP语言”中的重载:是指当一个对象(或类)使用其未定义的属性或方法的时候,其中的一些处理机制;
如:class B{
public $p1 = 1 ;
}
$b1 = new B();
echo $b1 -> p2 ;//将会出错,报出未定义属性p2;
$b1 -> f1();//程序出错,停止执行,报出未定义的方法f1;
所以,PHP中的重载技术,就是来应对上述“出错”而阻止程序继续执行的情况,使代码不出错,而且还能优雅的处理。
PHP中的重载分为:属性重载和方法重载;
属性重载:就是对一个对象的不存在的属性进行使用的时候,这个类中预先设定好的应对办法(或处理机制);
方法重载:当对一个对象的不存在的实例方法进行“调用”的时候,会自动调用类中的__call()这个魔术方法;
当对一个类的不存在的静态方法进行“调用”的时候,会自动调用类中的__callstatic()这个静态魔术方法;
针对当调用类的不存在的属性或方法的重载技术(或处理机制)如下:
class BaseController { /*这是一个魔术方法,当一个对象或者类获取其不存在的属性的值时, *如:$obj = new BaseController ; * $a = $obj -> a ; *该方法会被自动调用,这样做很友好,可以避免系统报错 */ public function __get($property_name){ echo "属性 $property_name 不存在\n"; //触发错误 trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR); } /*这是一个魔术方法,当一个对象或者类给其不存在的属性赋值时, *如:$obj = new BaseController ; * $obj -> a = 12 ; *该方法(__set(属性名,属性值))会被自动调用,这样做很友好,可以避免系统报错 */ public function __set($property_name,$value){ echo "属性 $property_name 不存在\n"; //触发错误 trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR); } /*这是一个魔术方法,当一个对象或者类的不存在属性进行isset()时, *注意:isset 用于检查一个量是否被赋值 如果为NULL会返回false *如:$obj = new BaseController ; * isset($obj -> a) ; *该方法会被自动调用,这样做很友好,可以避免系统报错 */ public function __isset($property_name){ echo "属性 $property_name 不存在\n"; //触发错误 trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR); } /*这是一个魔术方法,当一个对象或者类的不存在属性进行unset()时, *注意:unset 用于释放一个变量所分配的内存空间 *如:$obj = new BaseController ; * unset($obj -> a) ; *该方法会被自动调用,这样做很友好,可以避免系统报错 */ public function __unset($property_name){ echo "属性 $property_name 不存在\n"; //触发错误 trigger_error("发生错误,$property_name 属性不存在。",E_USER_ERROR); } /*当对这个类的对象的不存在的实例方法进行“调用”时,会自动调用该方法, * 这个方法有2个参数(必须带有的): * $methodName 表示要调用的不存在的方法名; * $argument 是一个数组,表示要调用该不存在的方法时,所使用的实参数据, * */ public function __call($methodName,$argument){ echo "实例方法 $methodName 不存在\n"; //触发错误 trigger_error("发生错误,$methodName 方法不存在。",E_USER_ERROR); } /*当对这个类的不存在的静态方法进行“调用”时,会自动调用该方法, * 这个方法有2个参数(必须带有的): * $methodName 表示要调用的不存在的方法名; * $argument 是一个数组,表示要调用该不存在的方法时,所使用的实参数据, * */ public function __callstatic($methodName,$argument){ echo "静态方法 $methodName 不存在\n"; //触发错误 trigger_error("发生错误,$methodName 方法不存在。",E_USER_ERROR); } }