本页目录
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:
Child 继承 Parent 的类
class Child extends Parent { // 代码部分}实例
实例中 Child_Site 类继承了 Site 类,并扩展了功能:
<?php// 子类扩展站点类别class Child_Site extends Site { var $category;
function setCate($par){ $this->category = $par; }
function getCate(){ echo $this->category . PHP_EOL; }}方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
重写前site类中的方法
function getUrl(){ echo $this->url . PHP_EOL; }
function getTitle(){ echo $this->title . PHP_EOL; }实例中重写了Child_Site类中, getUrl 与 getTitle 方法:
function getUrl() { echo $this->url . PHP_EOL; return $this->url;}
function getTitle(){ echo $this->title . PHP_EOL; return $this->title;}子类继承父类的属性和方法
子类继承父类的属性和方法,也就是说子类拥有父类所有的东西,包括 public(公有)、protected(保护)和 private(私有)的。
但是父类私有的属性和方法不能让子类直接调用,并不是说没有继承过来,而是继承过来了,但是要调用父类的私有属性和方法的话还是需要通过父类的 public、protected 方法调用。
<?php
class father {
public function __construct(){ echo "父类构造函数,如果子类没有重写构造函数将会调用这里。如果子类重写了构造函数则子类不用自动调用这个函数,而需要显示调用父类构造函数。"; }
public $m_fa="fa"; //公有 protected $m_fb="fb";//受保护 private $m_fc="fc"; //私有
public function getFa(){ echo $m_fa;} protected function getFb(){return $m_fb;} private function getFc(){return $m_fc;} public function getFaPrivate_1(){return $m_fc;} public function getFaPrivate_2(){return $m_fc;}
public function getAll(){ echo $this->m_fa, $this->m_fb, $this->m_fc;//此行代码打印fafbfc echo $this->getFa(), $this->getFb(), $this->getFc(); }
}
class son extends father{ public function __construct(){ parent::__construct(); //显示调用父类构造函数。 echo "子类构造函数调用"; }}
$class_fa = 'father';$class_son = 'son';$fa = new $class_fa();//父类 - father类的实例化$fa->getAll();$son = new $class_son();//子类 - son类的实例化$son->getFa();// 执行以下方法会报错,protected 无法在类外面进行调用的// 报错信息:Fatal error: Uncaught Error: Call to protected method father::getFb()...// $son->getFb();// 执行以下方法会报错,private 无法被继承,也无法在类外面进行调用的// 报错信息:Fatal error: Uncaught Error: Call to private method father::getFc()...// $son->getFc();
$son->getFaPrivate_2();//私有类成员只能被其定义所在类中访问?>子类继承父类构造方法
子类继承带有参数的父类的构造方法:
class students{ var $name,$age,$sex; function __construct($name,$age,$sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; }}
class master extends students{ var $hobby,$address; function __construct($name, $age, $sex,$hobby,$address){ parent::__construct($name, $age, $sex); $this->hobby = $hobby; $this->address = $address; }}