php面向对象--继承、多态

£可爱£侵袭症+ 提交于 2019-11-29 08:27:09

面向对象的第二大特征:继承

继承:将所有子类的公共属性和方法,提取出来放到父类中,然后在继承下来,即重复代码只需写一遍。

为什么要使用继承?

继承可以让我们摆脱重复代码,让功能得以拓展。

父类中有构造方法,实现继承:


<?php
 
/**
 * 汽车类
 */
class Car
{
    public $wheel; //汽车轮子
    function __construct($wheel)
    {
        $this->wheel = $wheel;
    }
 
    public function run()
    {
        echo '能跑';
    }
 
    public function stop()
    {
        echo '能刹车';
    }
}
 
/**
 * 卡车类,继承了汽车类
 */
class Truck extends Car
{
    public $load; //载货量
}
 
/**
 * 公交车类,继承汽车类
 */
class Bus extends Car
{
    public $peples; //载客量
 
    public function say(){
        echo '报站';
    }
}
 
 
$t = new Truck(12);//传递参数
printf("卡车有%d个轮子",$t->wheel);
echo '<br>';
$b = new Bus(6);//传递参数
printf("公交车有%d个轮子",$t->wheel);

既要执行子类的构造方法又要执行父类的构造方法:

<?php
 
/**
 * 汽车类
 */
class Car
{
    public $wheel; //汽车轮子
    function __construct($wheel)
    {
        $this->wheel = $wheel;
    }
 
    public function run()
    {
        echo '能跑';
    }
 
    public function stop()
    {
        echo '能刹车';
    }
}
 
/**
 * 卡车类,继承了汽车类
 */
class Truck extends Car
{
    public $load; //载货量
    function __construct($wheel)
    {
        //调用父类的构造方法
        parent::__construct($wheel);
    }
 
}
 
/**
 * 公交车类,继承汽车类
 */
class Bus extends Car
{
    public $peples; //载客量
    function __construct($wheel)
    {
        //调用父类的构造方法
        parent::__construct($wheel);
    }
 
    public function say(){
        echo '报站';
    }
}
 
 
$t = new Truck(12);//传递参数
printf("卡车有%d个轮子",$t->wheel);
echo '<br>';
$b = new Bus(6);//传递参数
printf("公交车有%d个轮子",$t->wheel);

在子类的构造方法中,使用 parent::__construct($wheel); 主动调用父类的构造方法。

继承--protected:受保护的

父类中被protected修饰的成员,只有在类内部以及继承类中使用,类外部不能使用。


<?php
 
/**
 * Class Controller
 */
class Controller
{
    private $arr = [];
 
    protected function assign($name,$value)
    {
        $this->arr[$name] = $value;
    }
 
    protected function display()
    {
        foreach ($this->arr as $key => $value) {
            echo "{$key}={$value}<br>";
        }
    }
 
}
 
/**
 * Class IndexController
 */
class IndexController extends Controller
{
    public function show()
    {
        $this->assign('no', '1001');
        $this->assign('name', 'zhangsan');
        $this->display();
    }
}
 
$index = new IndexController();
$index->show();

多态--抽象类

多态:不同的对象对于同一行为表现出来的不同的形态。

抽象方法的特点:

1.抽象方法没有方法体

2.有抽象方法的类必须是抽象类

抽象类的特点:

1.抽象类不能实现化,没有自己的对象

2.抽象类都是父类

继承抽象类时需要注意:

子类继承抽象类后,必须实现父类所有的抽象方法


<?php
 
//抽象类
abstract class Animal
{
    //抽象方法
    abstract protected function eat();
}
 
//老虎,继承动物
class Tiger extends Animal
{
    //具体实现
    public function eat()
    {
        echo '老虎撕咬食物吃';
    }
}
 
//蛇,继承动物
class Snake extends Animal
{
    //具体实现
    public function eat()
    {
        echo '蛇直接吞咽食物吃';
    }
}
 
$t = new Tiger();
$t->eat();
echo '<br>';
$s = new Snake();
$s->eat();

多态--覆盖

重写(覆盖)父类的方法时,访问修饰符需要注意什么:

1.方法名一致

2.子类方法的访问权限 高于 父类方法的访问权限


<?php
 
//顾客类
class Customer
{
    public $name; //姓名
 
    //购买商品
    public function buy()
    {
        echo '按原价购买物品';
    }
}
 
//vip类
class Vip extends Customer
{
    public $vipcard;//vip卡
 
    //购买商品
    public function buy()
    {
        echo '购买商品可以打折';
    }
}
 
$c = new Customer();
$c->buy();
echo '<br>';
$v = new Vip();
$v->buy()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!