當前位置:首頁 » 編程語言 » php方法繼承

php方法繼承

發布時間: 2023-05-29 11:01:17

php子類能否繼承父類的構造方法

1. new son 這個類的時候,會先調用 基類 father 的構造函數2.基類構造函數 又調用 init(); 所以輸出father3.private 只能限制son 不能直接訪問father類 init,但是不能限制 基類調用 自身的private 方法

Ⅱ php繼承一個父類,如何自動執行父類方法

你在父類寫一個成員函數 然後子類繼承 創建子類對象的時候 可以點出來父類的成員函數


比如

Student zs = new Student();

zs.SayHello() //點出來的是從父類的繼承來的成員函數

輸出結果為父類的->我是人類

publicclassPerson
{
publicvoidSayHello()//這只是父類的SayHello
{
echo"我是人類";
}
}

publicclassStudent:Person//已經繼承了Person父類
{
//我什麼都沒寫
}


Ⅲ PHP類繼承的問題,子類繼承父類,實例化子類,先執行父類還是先執行子類

不是這個意思。所謂「實例化子類的對象前要先實例化父類中的內容,為父類初始化」,是指當子類正在實例化時,總是鏈式調用父類構造方法初始化父類空間。換句話說,子類的構造方法必須先調用父類的構造方法,完了才能幹別的初始化工作。如果子類沒有顯式調用語句,編譯器會隱式幫你加上。
如:
public class A{ public A() { }}public class B extends A{ public B() { }}等價於:
public class A{ public A() { super();//這里實際上是Object(); //其他初始化工作 }}public class B extends A{ public B() { super();//這里實際上是A(); //其他初始化工作 }}另外,如果有這種情況:
public class A{ X x=new X(); public A() { }}public class B extends A{ Y y=new Y(); public B() {//這是類A空間里的欄位都已經初始化完畢。 }}在成員y被賦值之前,x一定已經存在。換句話說,X x=new X();一定先於Y y=new Y();執行。

Ⅳ 在php中,子類extends繼承了父類,當子類和父類同時存在構造函數__construct先執行哪一個呢

1、如果父類和子類中都沒有顯式的定義__construct,在實例化子類對象時,只會隱含的調用子類自己的構造方法。

2、如果父類中有顯式的構造方法__construct,而子類中沒有定義__construct,在實例化子類對象時,就會調用父類中的構造方法。

3、如果父類和子類中都顯式的定義了__construct,在實例化子類對象時,只會調用子類自己的構造方法(這就像是子類重構了父類的構造方法),而如果也想要調用父類的構造方法的話,就需要在子類的__construct 方法中顯式的調用,(如 __construct(){ parent::_construct();})。


(4)php方法繼承擴展閱讀

子類的構造函數名與子類名相同。

在子類里父類的構造函數不會自動執行。

要在子類里執行父類的構造函數,必須執行類似以下語句:

$this->[父類的構造函數名()]

類的構造函數統一命名為__construct()。

子類的構造函數名也是__construct()(也是廢話)。

在子類里父類的構造函數會不會執行,分兩種情況:

1、如子類不定義構造函數 __construct(),則父類的構造函數默認會被繼承下來,且會自動執行。

2、如子類定義了構造函數 __construct(),因為構造函數名也是__construct(),所以子類的構造函數實際上是覆蓋(override)了父類的構造函數。這時執行的是該子類的構造函數。

這時如果要在子類里執行父類的構造函數,必須執行類似以下語句:parent::__construct();

Ⅳ php如何通過子類繼承父類共有方法訪問父類私有屬性

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

Ⅵ php 繼承問題 私有的能不能繼承啊到底

在php中類的繼承是使用最多的一個編程特性,我們可以創建一個基類(父類)然後在這其中定義一些基本的方法,在我們的子類我們可以擴展父類中的方法這就叫覆蓋,但是如果說你在父類的某些很關鍵的方法你不能被子類繼承,因為如果子類繼承了這個方法可能給程序帶來一定的麻煩,所以我們希望這個方法是「私有」的,是不能被擴展的,這在php使用了final關鍵字來修飾你要不被繼承的方法。
php
final關鍵字可以修飾類同樣可以修改類中的方法,但它們的作用是差不多的,即如果你使用了final關鍵字來修飾了,那麼這個被修飾的類或者方法將不能被擴展或者繼承。你只能老老實實去引用它。如果你在類前面使用了final,這就是說明這個類不能使用繼承;如果你在方法前使用了php
final關鍵字,這就是說明這個方法不能被覆蓋。
簡單的說,final就是防止父類覆蓋的,加上它就不會被父類覆蓋

Ⅶ 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的屬性,也就可以理解明白了。

Ⅷ php子類可以繼承和訪問父類的私有屬性和方法嗎

你這樣理解也可以,當父類有私有的方法和屬性,子類是繼承不到的,所以子類不能訪問父類的私有方法和屬性。java
特性,private:類中只要限定為private的成員,只能被這個類本身訪問

Ⅸ php 繼承時,方法可見性只能更高,即對於同一方法,父類為protected ,子類只能是protected 或者 public.

一個語言一種規矩,沒必要較真去比較,如果都一樣了,那就不是php了,php還是單繼承呢,你怎麼不去較真,php是5.0以後引用的面向對象,5.0之前照樣能實現工作,你怎麼不說java非要用面向對象去寫呢,一個道理,別較真

Ⅹ php繼承問題

這個問題有意思 .

我覺得大家可能沒明白樓主的意思,private 不能被繼承,這個我想沒什麼爭議。

樓主在 A 中定義了一個 private 和 protect ,B 繼承 A ,但為空類,按理說 A 中的 private $priv 不會被 B 繼承,但為何在創建對象 $b = new B("b_1", "b_2"); $priv 卻能被賦值並且在後面有輸出?按理說 B 類中不應該有 $priv 啊?就算函數被重載了,但哪來的 $priv 變數呢?如果說是引用了父類中的 $priv ,那為何不見 parent::$priv 這樣的形式呢?

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:741
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372