7.8.2 PHP抽象方法和抽象類2
在OOP語言中,一個(gè)類可以有一個(gè)或多個(gè)子類磕蛇,而每個(gè)類都有至少一個(gè)公有方法做為外部代碼訪問其的接口。而抽象方法就是為了方便繼承而引入的。
當(dāng)類中有一個(gè)方法司顿,他沒有方法體,也就是沒有花括號(hào)兄纺,直接分號(hào)結(jié)束大溜,象這種方法我們叫抽象方法,必須使用關(guān)鍵字abstract定義估脆。
如: public abstract function fun();
包含這種方法的類必須是抽象類也要使用關(guān)鍵字abstract加以聲明钦奋。(即使用關(guān)鍵字abstract 修飾的類為抽象類)
抽象類的特點(diǎn):
不能實(shí)例化,也就new成對(duì)象
若想使用抽象類,就必須定義一個(gè)類去繼承這個(gè)抽象類付材,并定義覆蓋父類的抽象方法(實(shí)現(xiàn)抽象方法)朦拖。
其實(shí)抽象類對(duì)于子類(實(shí)現(xiàn)類),有一個(gè)約束的作用厌衔,
含有抽象方法的類肯定是抽象類璧帝,但是不是所有的抽象類都必須包含抽象方法。
test.php
<?php
/*
* 1. 什么是抽象方法 ?
* 定義: 一個(gè)方法如果沒有方法體(一個(gè)方法富寿,不使用"{}", 直接使用分號(hào)結(jié)束的方法睬隶,才是沒有方法體的方法 ),則這個(gè)方法就是抽象方法
*
* 一作喘、 聲明一個(gè)方法理疙,不使用{},而直接分號(hào)結(jié)束
* 二、如果是抽象方法泞坦,必須使用 abstract(抽象關(guān)鍵字來修飾)
*
* 2. 什么是抽象類 ?
* 一窖贤、 如果一個(gè)類中有一個(gè)方法是抽象的方法, 則這個(gè)類就是抽象類
* 二贰锁、如果聲明一個(gè)抽象類赃梧, 則這個(gè)類必須要使用 abstract關(guān)鍵字來修飾
*
*
* 注意:
*
* 1. 只要使用 abstract修飾的類, 就是抽象類
* 2. 抽象類是一種特殊的類豌熄, 特殊在哪里(在抽象類中可以有抽象方法)
* 3. 除了在抽象類中可以有抽象方法授嘀,以外,和正常的類完全一樣
*
* 注意2:
* 1. 抽象類不能實(shí)例化對(duì)象(不能創(chuàng)建出對(duì)象)
* 2. 如果看見抽象類锣险, 就必須寫這個(gè)類的子類, 將抽象類中的抽象方法覆蓋(加上方法體)
* 3. 子類必須全部實(shí)現(xiàn)(覆蓋重寫)抽象方法蹄皱, 這個(gè)子類才能創(chuàng)建對(duì)象, 如果只實(shí)現(xiàn)部分芯肤, 那么還有抽象方法巷折,則類也就必須是抽象類
*
* 抽象方法作用:
* 抽象方法的作用就是規(guī)定了大磺,子類必須有這個(gè)方法的實(shí)現(xiàn)炭懊, 功能交給子類
*
* 只寫出來結(jié)構(gòu)古掏, 而沒有實(shí)現(xiàn)栋盹, 實(shí)現(xiàn)交給具體的子類(按自己的功能)去實(shí)現(xiàn)
*
* 抽象類的作用:
*
* 就是要求子類的結(jié)構(gòu), 所以抽象類就是一個(gè)規(guī)范
*
*/
abstract class Person {
public $name;
public $age;
//特殊的方法抽象方法的存在
abstract function say();
abstract function eat();
function run() {
echo "11111111111111<br>";
}
function sleep() {
echo "2222222222222222<br>";
}
}
class StudentCn extends Person {
function say() {
echo "我是中國人裁替,我說中文<br>";
}
function eat() {
echo "我是中國人铁瞒,我用筷子吃飯";
}
}
class StudentEn extends Person {
function say() {
echo "I am English 势似,i say english<br>";
}
function eat() {
echo "我是外國人歌豺, 我用刀子和叉子吃飯";
}
}
$s1 = new StudentEn();
$s1 -> say();
$s1 -> eat();