PHP中子類(lèi)重載父類(lèi)的方法【parent::方法名】
在PHP中不能定義重名的函數(shù),也包括不能再同一個(gè)類(lèi)中定義重名的方法,所以也就沒(méi)有方法重載。單在子類(lèi)中可以定義和父類(lèi)重名的方法,因?yàn)楦割?lèi)的方法已經(jīng)在子類(lèi)中存在,這樣在子類(lèi)中就可以把從父類(lèi)中繼承過(guò)來(lái)的方法重寫(xiě)。
子類(lèi)中重載父類(lèi)的方法就是在子類(lèi)中覆蓋從父類(lèi)中繼承過(guò)來(lái)的方法,父類(lèi)中的方法被子類(lèi)繼承過(guò)來(lái)不就可以直接使用嗎?為什么還要重載呢?因?yàn)橛幸恍┣闆r我們必須要覆蓋的。例如,有一個(gè)“鳥(niǎo)”類(lèi),在這個(gè)類(lèi)中定義了鳥(niǎo)的通用方法“飛翔”。將“鴕鳥(niǎo)”類(lèi)作為它的子類(lèi),就會(huì)將“飛翔”的方法繼承過(guò)來(lái),但只要一調(diào)用“鴕鳥(niǎo)”類(lèi)中的這個(gè)“飛翔”的方法,鴕鳥(niǎo)就會(huì)飛走。雖然鴕鳥(niǎo)是不會(huì)飛的,但其他特性都具有“鳥(niǎo)類(lèi)”的特性,所以在聲明“鴕鳥(niǎo)”類(lèi)時(shí)還是可以繼承“鳥(niǎo)”類(lèi)的,但必須在“鴕鳥(niǎo)”類(lèi)中將“鳥(niǎo)”類(lèi)中繼承過(guò)來(lái)的“飛翔”方法改寫(xiě),就需要在子類(lèi)中重載父類(lèi)中的方法。
在下面的例子中,聲明的Person類(lèi)中有一個(gè)“說(shuō)話(huà)”方法,Student類(lèi)繼承Person類(lèi)后可以直接使用“說(shuō)話(huà)”方法。但Person類(lèi)中的“說(shuō)話(huà)”方法只能說(shuō)出它自己的成員屬性,而Student類(lèi)對(duì)Person類(lèi)進(jìn)行了擴(kuò)展,多添加了幾個(gè)新的成員屬性。代碼如下所示:
<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人類(lèi)中聲明一個(gè)通用的說(shuō)話(huà)方法,介紹一下自己
function say(){
echo "我的名字:".$this-> name.",性別:".$this ->sex.",年齡:".$this ->age."。<br>";
}
}
//聲明一個(gè)學(xué)生類(lèi),使用extends關(guān)鍵字?jǐn)U展(繼承)person類(lèi)
class Student extends Person {
private $school; //在學(xué)生類(lèi)中聲明一個(gè)所在學(xué)校school的成員屬性
//覆蓋父類(lèi)中的構(gòu)造方法,在參數(shù)列表中添加一個(gè)學(xué)校屬性,用來(lái)創(chuàng)建對(duì)象并初始化成員屬性
function __construct($name="",$sex="男",$age=1,$school=""){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."學(xué)習(xí)<br>";
}
//定義一個(gè)和父類(lèi)中同名的方法,將父類(lèi)中的說(shuō)話(huà)方法覆蓋并重寫(xiě),多說(shuō)出所在的學(xué)校名稱(chēng)
function say(){
echo "我的名字:".$this ->name.",性別:".$this ->sex.",年齡:".$this ->age.",在".$this ->school."學(xué)校上學(xué)<br>";
}
}
$student= new Student("張三","男",20,"edu"); //創(chuàng)建一個(gè)學(xué)生對(duì)象,并傳給一個(gè)學(xué)校名稱(chēng)參數(shù)
$student -> say(); //調(diào)用學(xué)生類(lèi)中覆蓋父類(lèi)的說(shuō)話(huà)方法
?>
改程序運(yùn)行后輸出的結(jié)果為:
我的名字叫:張三,性別:男,我的年齡是:20,在edu學(xué)校上學(xué)
在PHP中,提供了在子類(lèi)重載的方法中調(diào)用父類(lèi)被覆蓋方法的功能。這樣就可以在子類(lèi)重寫(xiě)的方法中,繼續(xù)使用從父類(lèi)繼承過(guò)來(lái)并被覆蓋的方法,然后再按要求多添加一些新功能。調(diào)用的格式是使用“parent:方法名”在子類(lèi)的重載方法中調(diào)用父類(lèi)中被覆蓋的方法。將上例中的代碼修改一下,在子類(lèi)重寫(xiě)的構(gòu)造方法中使用“parent::__construct()”調(diào)用父類(lèi)中被覆蓋的構(gòu)造方法,再多添加一條對(duì)子類(lèi)中新擴(kuò)展的成員屬性初始化的代碼。在子類(lèi)中重寫(xiě)的say()方法中使用“parent::say()”調(diào)用父類(lèi)中被覆蓋的say()方法,再添加上輸出子類(lèi)成員屬性的功能。
代碼如下所示:
<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人類(lèi)中聲明一個(gè)通用的說(shuō)話(huà)方法,介紹一下自己
function say(){
echo "我的名字:".$this-> name.",性別:".$this ->sex.",年齡:".$this ->age."。<br>";
}
}
//聲明一個(gè)學(xué)生類(lèi),使用extends關(guān)鍵字?jǐn)U展(繼承)person類(lèi)
class Student extends Person {
private $school; //在學(xué)生類(lèi)中聲明一個(gè)所在學(xué)校school的成員屬性
//覆蓋父類(lèi)中的構(gòu)造方法,在參數(shù)列表中添加一個(gè)學(xué)校屬性,用來(lái)創(chuàng)建對(duì)象并初始化成員屬性
function __construct($name="",$sex="男",$age=1,$school=""){
//調(diào)用父類(lèi)中被覆蓋的構(gòu)造方法,為從父類(lèi)中集成過(guò)來(lái)額出行賦初值
parent::__construct($name,$sex,$age);
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."學(xué)習(xí)<br>";
}
//定義一個(gè)和父類(lèi)中同名的方法,將父類(lèi)中的說(shuō)話(huà)方法覆蓋并重寫(xiě),多說(shuō)出所在的學(xué)校名稱(chēng)
function say(){
parent::say(); //調(diào)用父類(lèi)中被本方法覆蓋掉的方法
echo "在".$this ->school."學(xué)校上學(xué)<br>";
}
}
$student= new Student("張三","男",20,"edu"); //創(chuàng)建一個(gè)學(xué)生對(duì)象,并傳給一個(gè)學(xué)校名稱(chēng)參數(shù)
$student -> say(); //調(diào)用學(xué)生類(lèi)中覆蓋父類(lèi)的說(shuō)話(huà)方法
?>
上面的例子輸出的結(jié)果和前一個(gè)例子是一樣的,但在本例中通過(guò)在子類(lèi)中直接調(diào)用父類(lèi)中被覆蓋的方法要簡(jiǎn)便很多。另外,在子類(lèi)覆蓋父類(lèi)的方法時(shí)一定要注意,在子類(lèi)中重寫(xiě)的方法訪(fǎng)問(wèn)權(quán)限一定不能低于父類(lèi)被覆蓋的方法的訪(fǎng)問(wèn)權(quán)限。例如,如果父類(lèi)中的訪(fǎng)問(wèn)權(quán)限是protected,那么在子類(lèi)中重寫(xiě)的方法的權(quán)限就要是protected或public。
以上內(nèi)容是小編給大家介紹的PHP中子類(lèi)重載父類(lèi)的方法【parent::方法名】的相關(guān)內(nèi)容,希望對(duì)大家有所幫助!如果大家想了解更多資訊,敬請(qǐng)關(guān)注腳本之家網(wǎng)站!
- 解決PHP Opcache 緩存刷新、代碼重載出現(xiàn)無(wú)法更新代碼的問(wèn)題
- php 使用 __call實(shí)現(xiàn)重載功能示例
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)模擬一般面向?qū)ο笳Z(yǔ)言中的方法重載(overload)示例
- PHP面相對(duì)象中的重載與重寫(xiě)
- PHP面向?qū)ο缶幊讨钊肜斫夥椒ㄖ剌d與方法覆蓋(多態(tài))
- php函數(shù)重載的替代方法--偽重載詳解
- php繼承中方法重載(覆蓋)的應(yīng)用場(chǎng)合
- PHP使用方法重載實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建屬性的get和set方法
- PHP利用func_get_args和func_num_args函數(shù)實(shí)現(xiàn)函數(shù)重載實(shí)例
- php面向?qū)ο笕ヂ?(八)重載新的方法
- php面向?qū)ο蟮姆椒ㄖ剌d兩種版本比較
- PHP重載基礎(chǔ)知識(shí)回顧
相關(guān)文章
Laravel框架中composer自動(dòng)加載的實(shí)現(xiàn)分析
Laravel作為在國(guó)內(nèi)國(guó)外都頗為流行的PHP框架,風(fēng)格優(yōu)雅,其擁有自己的一些特點(diǎn)。下面這篇文章主要給大家介紹了關(guān)于Laravel框架中composer自動(dòng)加載實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12
詳解thinkphp+redis+隊(duì)列的實(shí)現(xiàn)代碼
本篇文章主要介紹了thinkphp+redis+隊(duì)列的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
laravel 配置路由 api和web定義的路由的區(qū)別詳解
今天小編就為大家分享一篇laravel 配置路由 api和web定義的路由的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
ThinkPHP 3.2.2實(shí)現(xiàn)事務(wù)操作的方法
這篇文章主要介紹了ThinkPHP 3.2.2實(shí)現(xiàn)事務(wù)操作的方法,簡(jiǎn)單分析了thinkPHP中事務(wù)的啟動(dòng)、提交、回滾等操作方法并給出了完整的事務(wù)提交與回滾操作實(shí)例,需要的朋友可以參考下2017-05-05
PHP實(shí)現(xiàn)數(shù)組向任意位置插入,刪除,替換數(shù)據(jù)操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)組向任意位置插入,刪除,替換數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了php中array_splice函數(shù)具體功能、參數(shù)及數(shù)組的插入、刪除、數(shù)值替換等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
php制作動(dòng)態(tài)隨機(jī)驗(yàn)證碼
這篇文章主要介紹了php制作動(dòng)態(tài)隨機(jī)驗(yàn)證碼的方法的相關(guān)資料,需要的朋友可以參考下2015-02-02
thinkphp5.1的model模型自動(dòng)更新update_time字段實(shí)例講解
這篇文章主要介紹了thinkphp5.1的model模型自動(dòng)更新update_time字段實(shí)例講解,文章代碼示例比較簡(jiǎn)單實(shí)用,有正在學(xué)習(xí)tp的同學(xué)可以跟著小編好好閱讀下2021-03-03
php jquery 多文件上傳簡(jiǎn)單實(shí)例
這篇文章主要介紹了php jquery 多文件上傳簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-12-12

