導航:首頁 > 編程語言 > php重寫父類方法

php重寫父類方法

發布時間:2023-01-01 05:28:53

php怎麼方法重載

php面向對象(OOP)編程完全教程:12.重載新的方法
在學習PHP 這種語言中你會發現, PHP中的方法是不能重載的, 所謂的方法重載就是定義相同的方法名,通過「參數的個數「不同或「參數的類型「不同,來訪問我們的相同方法名的不同方法。但是因為PHP是弱類型的語言, 所以在方法的參數中本身就可以接收不同類型的數據,又因為PHP的方法可以接收不定個數的參數,所以通過傳遞不同個數的參數調用不相同方法名的不同方法也是不成立的。所以在PHP裡面沒有方法重載。不能重載也就是在你的項目中不能定義相同方法名的方法。另外,因為PHP沒有名子空間的概念,在同一個頁面和被包含的頁面中不能定義相同名稱的方法, 也不能定義和PHP給我提供的方法的方法重名,當然在同一個類中也不能定義相同名稱的方法。
我們這里所指的重載新的方法所指的是什麼呢?其實我們所說的重載新的方法就是子類覆蓋父類的已有的方法,那為什麼要這么做呢?父類的方法不是可以繼承過來直接用嗎?但有一些情況是我們必須要覆蓋的,比如說我們前面提到過的例子裡面, 「Person」這個人類裡面有一個「說話」的方法,所有繼承「Person」類的子類都是可以「說話」的, 我們「Student」類就是「Person」類的子類,所以「Student」的實例就可以「說話「了, 但是人類裡面「說話」的方法裡面說出的是「Person」類裡面的屬性, 而「Student」類對「Person」類進行了擴展,又擴展出了幾個新的屬性,如果使用繼承過來的「say()」說話方法的話,只能說出從「Person」類繼承過來的那些屬性,那麼新擴展的那些屬性使用這個繼承過來的「say()」的方法就說不出來了,那有的人就問了,我在「Student」這個子類中再定義一個新的方法用於說話,說出子類裡面所有的屬性不就行了嗎?一定不要這么做, 從抽象的角度來講, 一個「學生」不能有兩種「說話」的方法,就算你定義了兩個不同的說話的方法,可以實現你想要的功能,被繼承過來的那個「說話「方法可能沒有機會用到了,而且是繼承過來的你也刪不掉。這個時候我們就要用到覆蓋了。
雖然說在PHP裡面不能定義同名的方法, 但是在父子關系的兩個類中,我們可以在子類中定義和父類同名的方法,這樣就把父類中繼承過來的方法覆蓋掉了。

代碼
<?
//定義一個"人"類做為父類
class Person
{
//下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡

//定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值
function __construct($name, $sex, $age)
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}

//這個人可以說話的方法, 說出自己的屬性
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age;
}
}

class Student extends Person
{

var $school; //學生所在學校的屬性

//這個學生學習的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 學習";
}

//這個學性可以說話的方法, 說出自己所有的屬性,覆蓋了父類的同名方法
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."我在".$this->school."上學;
}

}
?>

上面的例子, 我們就在「Student」子類里覆蓋了繼承父類裡面的」say()」的方法,通過覆蓋我們就實現了對「方法」擴展。
但是,像這樣做雖然解決了我們上面說的問題,但是在實際開發中,一個方法不可能就一條代碼或是幾條代碼,比如說「Person」類裡面的「say()」方法有裡面有100條代碼,如果我們想對這個方法覆蓋保留原有的功能外加上一點點功能,就要把原有的100條代碼重寫一次, 再加上擴展的幾條代碼,這還算是好的,而有的情況,父類中的方法是看不見原代碼的,這個時候你怎麼去重寫原有的代碼呢?我們也有解決的辦法,就是在子類這個方法中可以調用到父類中被覆蓋的方法, 也就是把被覆蓋的方法原有的功能拿過來再加上自己的一點功能,可以通過兩種方法實現在子類的方法中調用父類被覆蓋的方法:
一種是使用父類的「類名::「來調用父類中被覆蓋的方法;
一種是使用「parent::」的方試來調用父類中被覆蓋的方法;

代碼
class Student extends Person
{
var $school; //學生所在學校的屬性

//這個學生學習的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 學習";
}

//這個學性可以說話的方法, 說出自己所有的屬性,覆蓋了父類的同名方法
function say()
{
//使用父類的"類名::"來調用父類中被覆蓋的方法;
// Person::say();

//或者使用"parent::"的方試來調用父類中被覆蓋的方法;
parent::say();

//加上一點自己的功能
echo "我的年齡是:".$this->age."我在".$this->school."上學.";
}
}

現在用兩種方式都可以訪問到父類中被覆蓋的方法,我們選那種方式最好呢?用戶可能會發現自己寫的代碼訪問了父類的變數和函數。如果子類非常精煉或者父類非常專業化的時候尤其是這樣。 不要用代碼中父類文字上的名字,應該用特殊的名字 parent,它指的就是子類在 extends 聲明中所指的父類的名字。這樣做可以避免在多個地方使用父類的名字。如果繼承樹在實現的過程中要修改,只要簡單地修改類中 extends 聲明的部分。
同樣,構造方法在子類中如果沒有聲明的話,也可以使用父類中的構造方法,如果子類中重新定義了一個構造方法也會覆蓋掉父類中的構造方法,如果想使用新的構造方法為所有屬性賦值也可以用同樣的方式。

代碼
class Student extends Person
{

var $school; //學生所在學校的屬性

function __construct($name, $sex, $age, $school)
{
//使用父類中的方法為原有的屬性賦值
parent::__construct($name, $sex, $age);
$this->school=$school;
}

//這個學生學習的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 學習";
}

//這個人可以說話的方法, 說出自己的屬性
function say()
{
parent::say();
//加上一點自己的功能
echo "我的年齡是:".$this->age."我在".$this->school."上學.";
}

}

❷ PHP中父類里調用子類的方法

無解,除非是靜態public方法,function前加static,可以testB::demo2()這樣調用
子類重寫之後的方法父類沒法調用,換句話說,父類咋知道自己會被哪個子類繼承呢,就算你強轉虛表也不一樣,無解的問題
而且父類咋需要調用子類的方法呢,就算你以後實踐中有這樣的需求,也只能說明你設計上不合理

❸ PHP繼承的問題,調用父類的方法this指向問題。

我來說一說:


【一】…………public(僅有)屬性和方法的繼承…………

classa{
public$var='vara<br/>';
publicfunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
}
}

classbextendsa{
public$var='varb<br/>';
publicfunctionm(){
echo'funb<br/>';
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);

輸出:

varb
funb
————————————————————————————
object(b)[1]
public'var'=>string'varb<br/>'(length=11)

在這段代碼中所表示的,是我們常見的一種繼承方式,同為公有屬性的$var 和公有方法m()


在這里,$var和m()都被繼承並覆寫,實例化過後,內存中只有一個$var實例,通過var_mp($li);我們可以看到它。



【二】…………private(私有)屬性和方法的繼承…………

classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
}
}

classbextendsa{
private$var='varb<br/>';
privatefunctionm(){
echo'funb<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
parent::run();
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);

輸出:

varb
funb
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
.
vara
funa
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
————————————————————————————————
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)

這個時候,我們可以看到,在調用run方法時,首先它會調用到b類的私有屬性$var 和私有方法m(),隨後,又使用parent::run()調用父類的run()方法,我們可以看到,父類的run()方法調用後,它所調用的屬性和方法,都是a類的兩個私有屬性和方法,這種形式,和你的問題一致;


而它與$this指向無關,我們可以在這里看到,兩個$this都是指向b類。


而最有意思的是,在$li句柄中,我們卻看到了兩個屬性!一個是b類的屬性,一個是a類的屬性,這兩個屬性同時存在著,那麼,私有方法也自然是同時存在著。


【三】…………私有屬性和方法能不能被繼承…………

classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
}
classbextendsa{
publicfunctionrun(){
echo$this->var;
$this->m();
}
}
$li=newb();
$li->run();

輸出:

Notice:Undefinedproperty:b::$varinE:...onLine9
Fatalerror:Calltoprivatemethoda::m()fromcontext'b'inE:...onLine10

這可以證明,私有屬性和方法,無法被繼承,所以,你的代碼示例中所說,將a類的m()方法更改為private後,會顯示aa的屬性,也就可以理解明白了。

❹ thinkphp implements和extends的區別

extends 是繼承某個類
繼承之後可以使用父類的方法
也可以重寫父類的方法
implements 是實現多個介面
介面的方法一般為空的
必須重寫才能使用
extends是繼承父類,只要那個類不是聲明為final或者那個類定義為abstract的就能繼承,JAVA中不支持多重繼承,但是可以用介面來實
現,這樣就要用到implements,繼承只能繼承一個類,但implements可以實現多個介面,用逗號分開就行了

❺ php子類能不能重寫父類的private屬性

在父類中加個public方法,如private$aaa='test';publicfunctiongetAAA(){return$this->aaa;}在子類中調用parent::getAAA();就可以獲得父類私有屬性當然如果你想獲取多個,可以改成動態變數名,getAAA($v){return$this->{$v};}

❻ php中相同名稱的方法,父類方法為靜態子類能否為非靜態方法

不可以。
子類會繼承父類中的靜態方法,相當於在子類中定義了同名的靜態方法和成員方法。
這樣當在子類上調用該方法時,會產生歧義,因為無法確定調用的是靜態還是非靜態方法,所以編譯器不允許這樣的情況發生。

❼ Thinkphp報錯,詳細見問題補充。但是好像不影響使用

代碼段:
<?php
class IndexAction extends Action {
public function show(){
$m=M('User');//實例化 new model()
$arr=$m->select();
$this->assign("data",$arr);
$this->display();
}
}
如上面的代碼:類Action中的show方法有參數,類IndexAction在繼承Action後重寫show方法時去除了參數,因此會產生一個類似下面E_STRICT級別的警告:
Strict standards: Declaration of ... should be compatible with that of ...
意思就是子類(IndexAction)重寫的show方法與父類(Action)中的show方法不兼容,php方法重寫要求是要參數個數、方法名稱與父類要一致的,你要重寫的話就要這樣定義:
public function show($content,$charset='',$contentType='',$prefix=''){
//.....

}
不過不是錯誤,只是警告不影響運行。

❽ PHP 繼承、封裝、多態

-子類只能繼承父類的非私有屬性
-子類繼承父類後,相當於將父類的屬性和方法到子類,可以直接使用$this調用該屬性;
-php只能單繼承,不支持一個類繼承多個類。但是一個類可以進行多層繼承

類實現封裝是為了不讓外面的類隨意修改一個類的成員變數,所以在定義一個類的成員的時候,我們使用private關鍵字設置這個成員的訪問許可權只能被這個類的其他成員方法調用,而不能被其他類中的方法調用,即通過本類中提供的方法來訪問本類中的私有屬性
-所以在該類中我們會提供一個訪問私有屬性的方法
-然後我們一般會定義兩個方法來實現對一個變數的操作,即__get()和__set()方法

一個類被多個子類繼承,如果這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態(同一個類的不同子類表現出不同的形態)
-子類繼承父類->子類重寫父類的方法->父類引用指向子類對象

❾ PHP真的能算是面向對象的語言嗎

面向對象三大特性:封裝,繼承,多態
php可以封裝對象,也可以繼承,同樣可以實現多態
多態是指指出重寫和重載,php子類可以重寫父類的方法,也可以通過方法的參數數量不同來重載方法,我覺得是面向對象語言

❿ 封裝 繼承 多肽什麼意思 php

是的面向對象的三大特點

1.封裝

目的:讓類更安全

做法:成員變數變為私有的,通過方法間接操作成員變數,在方法裡面加限制條件

2.繼承

概念:子類可以繼承父類的一切

方法重寫:在子類裡面對父類進行方法重寫

特點:單繼承:一個子類可以有多個父類,一個父類可以派生出多個子類

override:方法重寫

overload:重載,編輯多態

3.多態(運行多態)

概念:父類引用子類實例,由於子類裡面對父類的方法進行重寫,父類引用在調用該方法的時候表現出的不同狀態

條件:1必須發生在集成下

2必須重寫父類方法

3父類引用調用方法

如果一個方法需要一個父類參數,可以給一個子類對象

閱讀全文

與php重寫父類方法相關的資料

熱點內容
伺服器被ban的物品怎麼合成 瀏覽:989
如何理解壓和垂 瀏覽:481
程序員的愛情秘密 瀏覽:266
量子計算機會影響程序員嗎 瀏覽:659
安卓開發如何與伺服器連接電腦 瀏覽:993
式數學pdf 瀏覽:773
伺服器如何連接vcenter管理界面 瀏覽:23
php解析域名ip 瀏覽:440
java單例多例 瀏覽:485
51單片機唱 瀏覽:86
csgo如何加入好友伺服器 瀏覽:115
bresenham演算法畫圓簡單代碼 瀏覽:827
怎麼做反詐app 瀏覽:459
亞信面試java 瀏覽:852
生化危機1解壓視頻 瀏覽:347
miui安卓怎麼設置 瀏覽:781
美團app套餐相冊怎麼改 瀏覽:607
單片機程序存儲c 瀏覽:489
賽高網解壓密碼 瀏覽:775
雲伺服器安裝賺錢寶 瀏覽:107