PHP基础之 重载 的实现方式
===================PHP中的伪重载Overloading==================
PHP中没有像C#或java中的重载,但可以通其它方法实现重载
重载:属性重载与方法重载
属性重载:
__set($proName,$val)给变量设值、__get($proName)给变量赋值
在PHP5.1以后有__isset($proName)检查变量是否存在、_unset($proName)释放变量
给私有的或未定义的类的变量取值和赋值时,会自动调用__get()和_set()方法
方法的重载:
[不能通过多个构造函数或多个方法名相同的方法来实现重载]
方法一:通过‘魔术方法’:__call($methodName,$prams) 、__callStatic($methodName,$prams)来实现方法的重载[参数只能值传递]
方法二:通过判断参数个数和类型来实现重载
当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。[PHP5.3手册]
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。[PHP5.3手册]
<?php class Overloading { private $oName; private $oCount; //使用__set()来约束所有的私有属性 public function __set($proName,$val) { if($proName=="oName"){ $this->oName=$val; }elseif ($proName=="oCount") { if($val>0) { $this->oCount=$val; }else { echo "赋值失败,必须大于0\n"; } } } //使用__get()来获取的私有属性 public function __get($proName) { if(isset($proName)) { return $this->proName; } else { return null; } } //外部在调用未定义的静态方法时,被自动调用 public static function __callStatic($methodName,$prams) { if($methodName=="Sum") { echo "静态方法:'$methodName' 被调用了,参数:". implode(', ', $prams). "\n"; } } //外部在调用未定义的方法时,被自动调用 public function __call($method,$prams) { if($method=="JiSuan") { if(count($prams)==2&&is_int($prams[0])){ return $this->JiSuan1($prams[0],$prams[1]); } elseif (count($prams)==3) { return $this->JiSuan2($prams[0],$prams[1],$prams[2]); } } } public function JiSuan1($n1,$n2) { return $n1+$n2; } public function JiSuan2($n1,$n2,$n3) { return $n1*$n2*$n3; } //通过判断参数个数和类型is_int()/is_array()来实现重载 public function Compute() { $args = func_get_args(); switch (func_num_args()) { case 2: return $this->JiSuan1($args[0],$args[1]); case 3: return $this->JiSuan2($args[0],$args[1],$args[2]); } } } $o1 = new Overloading(); echo $o1->oName="小强"."\n"; echo ($o1->oCount=2)."\n"; echo ($o1->oCount=-1)."\n\n";//因为赋值失败,返回值为-1 //调用未定义的实例方法(通过_call()内部来判断方法名和参数个数和类型实现方法重载) echo "两个数的和:".$o1->JiSuan(55,5)."\n"; echo "三个数的积:".$o1->JiSuan(5,5,5)."\n\n"; //调用未定义的静态方法(通过_callStatic()内部来判断方法名和参数个数和类型实现静态方法的重载) Overloading::Sum(3,2,1); //调用公共方法(内部判断参数 实现重载) echo "两个数的和:".$o1->Compute(5,6)."\n"; echo "三个数的积:".$o1->Compute(2,2,2)."\n\n"; /* 输出结果: 小强 2 赋值失败,必须大于0 -1 两个数的和:60 三个数的积:125 静态方法:'Sum' 被调用了,参数:3, 2, 1 两个数的和:11 三个数的积:8 */