PHP的重载与覆盖及魔术方法使用
重载(overload),是发生在同一类中(与什么父类子类、继承毫无关系)
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载overload是一个类中多态性的一种表现。
覆盖(override), 是发生在子类中,(也就是说必须有继承的情况下才有覆盖发生)
子类继承一个类,也就有了父类了全部方法,如果功能要变,那就把那个函数在子类中重新实现一遍。覆盖override也是一个类多态性的一种表现
严格意义上讲:重载必须函数名相同,参数在类型或者参数个数上必须有所不同,子类中具有与父类相同的返回类型及参数表,子类方法覆盖父类方法
PHP是弱类型语言,不支持严格意义上的重载,重写则对参数类型和个数也没有严格要求。
重写实例:
<?php
class Animal{
$height = 1;
public function eat($energy){
$this->height = $this->height+$energy/1000;
}
}
class Cat extend Animal{
public function eat($energy){
$this->height = $this->height+energy/2000;
}
}
$smallCat = new Cat();
$energy= 1000;
$smallCat->eat($energy);
?>
由于PHP不支持重载,但是可以曲线救国,实现方法就是使用PHP5.3的新特性:魔术方法__call(),__callStatic()
重载实例:
<?php
class Cat{
public $height = 1;
public $weight = 1;
public function __call($name,$arg){
$count = count($arg);
if($count>0){
switch($count){
case 1:
$this->height++;
break;
case 2:
$this->height++;
$this->weight++;
break;
default :
$this->height = $this->height+2;
$this->weight = $this->weight+2;
break;
}
}
}
}
$smallCat = new Cat();
$fruit = 1;
$meat = 1;
$smallCat->eat($fruit);
$smallCat->eat($fruit,$meat);
}
?>
如果是静态调用使用__callStatic,用法同上
__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。
__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。
__call($funcname, $arguments)
__callStatic($funcname, $arguments)
参数说明:
$funcname String 调用的方法名称。
$arguments Array 调用方法时所带的参数。
__call 例子
- <?php
- class Member{
- protected $memberdata = array();
- public function __call($func, $arguments){
- list($type, $name) = explode('_', $func);
- if(!in_array($type, array('set','get')) || $name==){
- return ;
- }
- switch($type){
- case 'set':
- $this->memberdata[$name] = $arguments[0];
- break;
- case 'get':
- return isset($this->memberdata[$name])? $this->memberdata[$name] : ;
- break;
- default:
- }
- }
- }
- class User extends Member{
- public function show(){
- if($this->memberdata){
- foreach($this->memberdata as $key=>$member){
- echo $key.':'.$member.'<br>';
- }
- }
- }
- }
- class Profession extends Member{
- public function show(){
- if($this->memberdata){
- foreach($this->memberdata as $key=>$member){
- echo $key.':'.$member.'<br>';
- }
- }
- }
- }
- $userobj = new User();
- $userobj->set_name('fdipzone');
- $userobj->set_age(29);
- $userobj->show();
- $probj = new Profession();
- $probj->set_profession('IT SERVICE');
- $probj->set_price(2500);
- $probj->show();
- ?>
_callStatic例子
- <?php
- class Member{
- protected static $memberdata = array();
- public static function __callStatic($func, $arguments){
- list($type, $name) = explode('_', $func);
- if(!in_array($type, array('set','get')) || $name==){
- return ;
- }
- $feature = get_called_class(); //获取静态方法调用的类名
- switch($type){
- case 'set':
- self::$memberdata[$feature][$name] = $arguments[0];
- break;
- case 'get':
- return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : ;
- break;
- default:
- }
- }
- }
- class User extends Member{
- public static function show(){
- $feature = get_called_class();
- if(self::$memberdata[$feature]){
- foreach(self::$memberdata[$feature] as $key=>$member){
- echo $key.':'.$member.'<br>';
- }
- }
- }
- }
- class Profession extends Member{
- public static function show(){
- $feature = get_called_class();
- if(self::$memberdata[$feature]){
- foreach(self::$memberdata[$feature] as $key=>$member){
- echo $key.':'.$member.'<br>';
- }
- }
- }
- }
- User::set_name('fdipzone');
- User::set_age(29);
- User::show();
- Profession::set_profession('IT SERVICE');
- Profession::set_price(2500);
- Profession::show();
- ?>