小編給大家分享一下PHP類方法的重寫(xiě)原則,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)主要從事做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)羅城,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
PHP類方法重寫(xiě)原則:1、final修飾的類方法不可被子類重寫(xiě);2、PHP是否重寫(xiě)父類方法只會(huì)根據(jù)方法名是否一致判斷;3、重寫(xiě)時(shí)訪問(wèn)級(jí)別只可以等于或者寬松于父類,不可提升訪問(wèn)級(jí)別。
PHP類方法重寫(xiě)原則:
1、final修飾的類方法不可被子類重寫(xiě)
final修飾的類方法不可被子類重寫(xiě) 即便final private方法無(wú)法被繼承 子類仍不能對(duì)齊進(jìn)行重寫(xiě)
class FinalMethod { //可繼承不可重寫(xiě) final public function finalPublic() { echo "can be inherited, but be overrided"; } //可繼承不可重寫(xiě) final protected function finalProtected() { echo "can be inherited, but be overrided"; } //不可繼承不可重寫(xiě) 雖然子類繼承不到父類的private方法 但同時(shí)也會(huì)被final限制無(wú)法重寫(xiě) final private function finalPrivate() { echo "can not be inherited or be overrided"; } //雖然不可繼承 但子類里可重寫(xiě)此方法 private function private() { echo "can not be inherited ,but be overrided"; } } class Override extends FinalMethod { //error public function finalPublic() { } //error protected function finalProtected() { } //error private function finalPrivate() { } //correct public/protected/private function private() { //子類繼承父類重寫(xiě)父類方法時(shí)訪問(wèn)級(jí)別只能更加寬松 不可更為嚴(yán)格 } }
2、PHP是否重寫(xiě)父類方法只會(huì)根據(jù)方法名是否一致判斷(5.3以后重寫(xiě)父類方法參數(shù)個(gè)數(shù)必須一致)
這里并不是說(shuō)方法參數(shù)無(wú)任何作用 PHP無(wú)重載機(jī)制 所以判斷是不是重寫(xiě)只會(huì)通過(guò)方法名(C/C++不僅要方法名相同,參數(shù)也相同時(shí)才被視為重寫(xiě),否則即為重載,即新定義了一個(gè)多態(tài)函數(shù)的態(tài)) 當(dāng)方法名相同時(shí)即被認(rèn)為是在重寫(xiě)父類方法,5.2可以參數(shù)不同,5.3以后參數(shù)需和父類方法一致,且都追尋繼承訪問(wèn)級(jí)別的規(guī)則。
class Father { public function index($args_1) { } } class Child extends Father { //5.3以后重寫(xiě)方法必須與父類保持參數(shù)個(gè)數(shù)相同 public function index($args_1, $args_2) { //在C/C++中此為重載非重寫(xiě),因?yàn)镃/C++具有標(biāo)準(zhǔn)的多態(tài)機(jī)制,會(huì)因參數(shù)不同而視為某一方法的另一種態(tài) //but在php中此依然為重寫(xiě) 但5.3以后此為非法 必須與父類的方法參數(shù)個(gè)數(shù)保持一致 } //5.3以后重寫(xiě)方法必須與父類保持參數(shù)個(gè)數(shù)相同 private function index($args_1, $args_2) { //C/C++會(huì)因?yàn)閰?shù)不同于父類方法而視為重載,即新定義了一個(gè)函數(shù)的態(tài),所以不會(huì)受到繼承訪問(wèn)權(quán)限的限制 //但php仍然會(huì)被視為對(duì)父類方法的重寫(xiě),會(huì)受到繼承訪問(wèn)權(quán)限的升降規(guī)則限制 } }
3、重寫(xiě)時(shí)訪問(wèn)級(jí)別只可以等于或者寬松于父類 不可提升訪問(wèn)級(jí)別
父類的public方法不能被子類重寫(xiě)為protected或者private,protected方法不能被重寫(xiě)為private,可以寬松er,不可以嚴(yán)格er
class Father { public function index() { } } class Child extends Father { protected/private function index() { //訪問(wèn)權(quán)限提升 錯(cuò)誤 //父類為public 則子類重寫(xiě)也只能為public //父類為protected 則子類可為public/protected //父類為private 則子類public/protected/private皆可 } }
其實(shí)關(guān)于訪問(wèn)級(jí)別繼承規(guī)則有很多有趣的地方
private在我們常識(shí)中是無(wú)法被繼承的,子類拿不到,但其訪問(wèn)級(jí)別已是最高,所以你在子類中可以寫(xiě)成private protected public 仿佛是我們自己重新定義了一個(gè)函數(shù)一樣,這點(diǎn)在5.2版本之前尤其突出,因?yàn)?.2之前的版本在繼承重寫(xiě)父類方法是可以不保持參數(shù)個(gè)數(shù)相同,但5.3以后加強(qiáng)了這方面的限制,參數(shù)個(gè)數(shù)必須與父類相同
注:
子類實(shí)現(xiàn)父類的抽象方法或某類實(shí)現(xiàn)接口的方法時(shí)其實(shí)仍屬于繼承關(guān)系,仍追尋訪問(wèn)等級(jí)只能降低不可提升的規(guī)則
而且
抽象方法不可被聲明為private,abstract修飾的方法肯定是用于繼承實(shí)現(xiàn)的,所以只能是public或者protected 接口的方法聲明必須為public,interface里聲明的方法也肯定是被繼承實(shí)現(xiàn)的,且只能是public, implements 此接口的類也指定重寫(xiě)成public類型的方法
看完了這篇文章,相信你對(duì)PHP類方法的重寫(xiě)原則有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前題目:PHP類方法的重寫(xiě)原則
當(dāng)前地址:http://muchs.cn/article2/ghggoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、靜態(tài)網(wǎng)站、商城網(wǎng)站、網(wǎng)站改版、搜索引擎優(yōu)化、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)