7.6.1 PHP類的繼承
繼承已為大家所熟知的一個(gè)程序設(shè)計(jì)特性俏蛮,PHP 的對象模型也使用了繼承撼泛。繼承將會(huì)影響到類與類冷离,對象與對象之間的關(guān)系吵冒。
比如,當(dāng)擴(kuò)展一個(gè)類西剥,子類就會(huì)繼承父類的所有公有和保護(hù)方法痹栖。但是子類的方法會(huì)覆蓋父類的方法。
繼承對于功能的設(shè)計(jì)和抽象是非常有用的瞭空,而且對于類似的對象增加新功能就無須重新再寫這些公用的功能揪阿。
php繼承的關(guān)鍵字:extends
格式:
[修飾符] class 子類名 extends 父類名{ ... }
通過繼承可以簡化類的定義。
class Person{
public $name;
public $age;
function getInfo(){...}
}
class Student{
public $name;
public $age;
public $school;
function getInfo(){...}
function study(){...}
}
使用繼承后的效果:
class Person{
public $name;
public $age;
function getInfo(){...}
}
class Student extends Person{
public $school;
function study(){...}
}
PHP只支持單繼承咆畏,不允許多重繼承南捂。一個(gè)子類只能有一個(gè)父類,不允許一個(gè)類直接繼承多個(gè)類旧找,但一個(gè)類可以被多個(gè)類繼承溺健。
可以有多層繼承,即一個(gè)類可以繼承某一個(gè)類的子類钮蛛,如類B 繼承了類A鞭缭,類C又繼承了類B,那么類C也間接繼承了類A魏颓,
class A{
....
}
class B extends A{
....
}
class C extends B{
....
}
子類與父類的屬性與方法
子類繼承父類的所有內(nèi)容岭辣,但父類中的private部分不能直接訪問
子類中新增加的屬性和方法是對父類的擴(kuò)展
子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋
訪問類型控制
訪問權(quán)限:
private protected public(默認(rèn)的)
在同一類中: 可以 可以 可以
類的子類中: X 可以 可以
其他外部類中: X X 可以
定義一個(gè)父類(基類)
<?php
//聲明一個(gè)人類甸饱,定義人所具有的一些其本的屬性和功能成員沦童,作為父類
class Person {
var $name; //聲明一個(gè)存儲(chǔ)人的名字的成員
var $sex; //聲明一個(gè)存儲(chǔ)人的性別的成員
var $age; //聲明一個(gè)存儲(chǔ)人的年齡的成員
function __construct($name="", $sex="男", $age=1) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
function say(){
echo "我的名字:".$this->name.",性別:".$this->sex.",年齡:".$this->age."搞动。<br>";
}
function run() {
echo $this->name."正在走路躏精。<br>";
}
}
<?php
//聲明一個(gè)類作為父類使用,將它的成員都聲明為保護(hù)的
class MyClass {
protected $var1=100; //聲明一個(gè)保護(hù)的成員屬性并給初值為100
protected function printHello() { //聲明一個(gè)成員方法使用protected關(guān)鍵字設(shè)置為保護(hù)的
echo "hello<br>"; //在方法中只有一條輸出語句作為測試使用
}
}
//聲明一個(gè)MyClass類的子類試圖訪問父類中的保護(hù)成員
class MyClass2 extends MyClass {
//在類中聲明一個(gè)公有方法鹦肿,訪問父類中的保護(hù)成員
function useProperty() {
echo "輸出從父類繼承過來的成員屬性值".$this->var1."<br>"; //訪問父類中受保護(hù)的屬性
$this->printHello(); //訪問父類中受保護(hù)的方法
}
}
$subObj = new MyClass2(); //初始化出子類對象
$subObj->useProperty(); //調(diào)用子類對象中的方法實(shí)現(xiàn)對父類保護(hù)的成員訪問
echo $subObj->var1; //試圖訪問類中受保護(hù)的成員矗烛,結(jié)果出錯(cuò)
子類中重載父類的方法
在子類里面允許重寫(覆蓋)父類的方法
在子類中,使用parent訪問父類中的被覆蓋的屬性和方法
parent::__construce();
parent::fun();
<?php
class Person {
protected $name;
protected $sex;
public function __construct($name=“”, $sex=“男”) { ...屬性賦值 }
public function say(){ ...輸出屬性信息 }
}
class Student extends Person { //聲明學(xué)生類箩溃,使用extends繼承Person類
private $school;
//構(gòu)造方法重寫(覆蓋)
public function __construct($name="", $sex="男", $school="") {
parent::__construct($name,$sex); //調(diào)用父類構(gòu)造方法瞭吃,初始化父類
$this->school = $school; //新添加一條為子類中新聲明的成員屬性賦初值
}
public function say( ) { //方法重寫(覆蓋)
parent::say(); //調(diào)用父類中被本方法覆蓋掉的方法
echo "在".$this->school."學(xué)校上學(xué)<br>"; //在原有的功能基礎(chǔ)上多加一點(diǎn)功能
}
}
$student = new Student("張三","男",20, "edu"); //創(chuàng)建學(xué)生對象,并多傳一個(gè)學(xué)校名稱參數(shù)
$student->say(); //調(diào)用學(xué)生類中覆蓋父類的說話方法