php面向对象编程的多态性2016-10-29guaitu
php方法重截(overload)
重截是类的多态性的一种实现。函数重载是指一个标识符被用作多个函数名,且能够通过函数的参数个数或者参数类型将这些同名的函数区分开来,调用时不会发生混淆。调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。php5支持重载,但在重载的具体实现上,与其它编程语言有较大的区别。
<?php
class A{
public function test1(){
echo "test1";
}
public function test1($a){
echo "hello";
}
}
$a=new A();
$a->test1();
?>
上面这种用法不对,运行时将会报错:Fatal error: Cannot redeclare A::test1() in……
php5如何实现重载(官方不推荐)
php5通过魔术函数__call来实现函数重载。php5默认情况下不支持直接方法重载,可以使用__call模拟方法重载的效果。
<?php
class A{
public function test1($p){
echo "接收一个参数";
}
public function test2($p){
echo "接收两个参数".__CLASS__; //__CLASS__是魔术常量,显示当前类名
}
//用魔术方法__call实现方法重载
// __call是一个对象调用某个方法,而该方法不存在,则系统会自动调用__call
function __call($method,$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); //输出:接收一个参数
echo "<br />";
$a->test(100,2);
echo "<br />".__LINE__; //以下是魔术常量的使用
echo "<br />".__FILE__;
echo "<br />".__DIR__;
?>
php方法的重写/方法的覆盖(override)
当一个父类知道所有子类都有一个方法,但是父类不能确定该方法的内容,可以让子类去覆盖这个方法。1)要实现重写,父类和子类的函数名及参数需要完全一致2)如果子类需要调用父类的某个方法(public/protected),则可以使用parent:方法名(参数...);或者父类名:方法名(参数...)例:动物的叫声
<?php
//抽象一个Animal类
class Animal{
public $name;
protected $price;
function cry(){
echo "暂时不知道,父类暂定不了";
}
}
class Dog extends Animal{
function cry(){ //覆盖父类的cry方法
echo "狗汪汪叫!";
}
}
class Pig extends Animal{
function cry(){ //覆盖父类的cry方法
echo "猪哼哼叫!";
echo "<br /".parent::cry(); //子类中调用父类的方法
}
}
//创建一只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry();
?>
3)方法覆盖时,访问修饰符可以不一样,但子类的访问范围必须>=父类的
<?php
//在实现方法覆盖的时候,访问修饰符可以不一样,
//但必须满足:子类的访问范围要>=父类的访问范围
class Animal{
public $name;
protected $price;
//覆盖父类的cry方法
public function cry(){
echo "暂时不知道,父类暂定不了";
}
}
class Dog extends Animal{
protected function cry(){ //此句会报错,因为父类的cry()是public的,子类的protected权限小于父类的
echo "狗汪汪叫!";
}
}
class Pig extends Animal{
function cry(){
echo "猪哼哼叫!";
//调用父类的方法
echo "<br /".parent::cry();
}
}
//创建一只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry();
?>
URL:http://www.bianceng.cn/webkf/PHP/201610/50465.htm