php中的重载感觉不是很完善
【注意】php不能以参数列表不同的形式来构成重载,构造方法同样也不行
PHP5 中如何通过魔术函数来实现方法重载的效果
代码说明
<?php
class A{
public function test1($p){
echo "接收一个参数";
echo "<br/>接收到参数是";
var_dump($p);
}
public function test2($p){
echo "接收两个参数<br/>";
var_dump($p);
}
//这些提供一个__call
//__call 是它一个对象调用某个方法,而该方法不存在,则
//系统会自动调用__call
function __call($method,$p){
var_dump($p);
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1);
$a->test(56,90);
?>
小结: 关于重载
① php5 默认情况下不直接支持方法重载
② php5 可以同__call魔术方法,模拟一个方法重载的效果.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
方法的重写
+++方法的重写/方法的覆盖(override)
① 先看一个问题
当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法,具体用法如下:
<?php
//抽象一个Animal类
class Animal{
public $name;
protected $price;
function cry(){
echo "不知道动物怎么叫..";
}
}
class Dog extends Animal{
//覆盖
function cry(){
echo "小狗汪汪叫..";
}
}
class Pig extends Animal{
//覆盖.
function cry(){
echo "哼哼叫..";
}
}
//创建一个只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry();
?>
关于方法重写细节讨论
1. 要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不要求参数的名称一样.
2. 如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) , 父类名::方法名(参数...)
3. 在实现方法覆盖的时候,访问修饰符可以不一样 //但是必须满足: 子类的访问范围>=父类的访问范围
多态体现在什么地方?
class Animal{
public function cry(){
echo '动物叫唤..';
}
}
class Cat extends Animal{
public function cry(){
echo "abc";
}
}
$cat1=new Cat();
$cat1->cry();
当子类没有覆盖父类的方法则 $cat1->cry() 调用的是父类,当 子类覆盖了父类的方法,则调用自己的cry() .