韩顺平php视频笔记72-74 面向对象编程的三大特征3 重载override与重写overload 魔术常量

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() .



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值