面向对象的第二大特征:继承
继承:将所有子类的公共属性和方法,提取出来放到父类中,然后在继承下来,即重复代码只需写一遍。
为什么要使用继承?
继承可以让我们摆脱重复代码,让功能得以拓展。
父类中有构造方法,实现继承:
<?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()
来源:https://blog.csdn.net/CHRBK/article/details/100656783