学习PHP面向对象(七) 多态

多态性  
例 : 
复制代码代码如下:

<?php 
class Animal{ 
public $name; 
public $price; 
function cry(){ 
echo 'i don\'t know'; 


class Dog extends Animal{ 
//覆盖、重写 
function cry(){ 
echo 'Wang Wang!'; 
Animal::cry();//这里不会报错,能正确执行父类的cry(); 


$dog1=new Dog(); 
$dog1->cry(); 
?> 

小结: 
1、当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法如何写,可以让子类去覆盖它的方法,方法覆盖(重写),必须要求子类的方法名和参数个数完全一致 
2、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名 
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限) 
如 父类public function cry(){} 子类 protected function cry(){} 则会报错 
但是子类的访问权限可以放大,如: 
父类private function cry(){} 子类 protected function cry(){} 可以正确执行 
扩展: 
方法重载(overload) 
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数 
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数 
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载, 
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call 
【官方不推荐使用】 
PHP中有以下几个魔术常量:__LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ 等 
例: 
复制代码代码如下:

<?php 
class A{ 
function test1($p){ 
echo 'test1<br/>'; 

function test2($p){ 
echo 'test2<br/>'; 

function __call($method,$p){ 
//这里$p为数组,上面两个变量名可自定义 
if($method == 'test'){ 
if(count($p)==1){ 
$this->test1($p); 
} else if(count($p)==2){ 
$this->test2($p); 




$a=new A(); 
$a->test(5); 
$a->test(3,5); 
?> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值