當前位置:首頁 » 編程語言 » php類的繼承

php類的繼承

發布時間: 2023-01-02 22:26:27

『壹』 php中類的繼承是通過哪個關鍵字來實現的

php類有三種:
普通寫的class 類 用extends來繼承
抽象類abstract類 也是用extends來繼承
介面類interface類用的是implements來繼承的

『貳』 php中的類是單繼承,那要有多個類繼承怎麼辦

PHP沒有多繼承的特性。即使是一門支持多繼承的編程語言,我們也很少會使用這個特性。在大多數人看來,多繼承不是一種好的設計方法。想要給某個類添加額外的特性,不一定要使用繼承。這里我提供一種模擬多繼承的方法以供參考。


PHP有一個魔術方法,叫做__call。當你調用一個不存在的方法時,這個方法會被自動調用。這時,我們就有機會將調用重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:

本身的方法 -> 父類1的方法 -> 父類2的方法...


模擬過程大致是這樣:將各個父類實例化,然後作為子類的屬性。這些父類提供一些公有的方法。當子類擁有某方法時,__call()函數不會被調用。這相當於「覆蓋」了父類的方法。當調用了不存在的方法時,通過__call()方法依次從父類中尋找可以調用的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。


<?php
classParent1{
functionmethod1(){}
functionmethod2(){}
}
classParent2{
functionmethod3(){}
functionmethod4(){}
}
classChild{
protected$_parents=array();
publicfunctionChild(array$parents=array()){
$_parents=$parents;
}

publicfunction__call($method,$args){
//從「父類"中查找方法
foreach($this->_parentsas$p){
if(is_callable(array($p,$method))){
returncall_user_func_array(array($p,$method),$args);
}
}
//恢復默認的行為,會引發一個方法不存在的致命錯誤
returncall_user_func_array(array($this,$method),$args);
}
}
$obj=newChild(array(newParent1(),newParent2()));
$obj->method1();
$obj->method3();

這里沒有涉及屬性的繼承,但實現起來並不困難。可以通過__set()和__get()魔術方法來模擬屬性的繼承。請你動手實踐。

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

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

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

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


(3)php類的繼承擴展閱讀

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

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

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

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

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

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

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

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

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

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

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

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

『伍』 請教高手PHP中一個類怎樣繼承多個類

一般只能繼承一個類,不過你可以讓他們連起來,比如你的a類要繼承b,c,d類,可以讓c繼承b類,d繼承c類,然後a繼承d類

『陸』 php 繼承一個類一定要引用一下嗎

php有自動載入類的功能,但是需要遵循一定的規則,並且需要額外的代碼支持實現。

對於你說的問題,較常見的情況是b.php裡面雖然沒有引用a.php,但是c.php可能引用了a.php及b.php。只要在一個php進程中保證引用了這些文件就行,引用位置是可變的。例如在第一行引用和在第二行引用沒有區別,只要在new之前引用過就好了。但是明顯這不是值得推薦的。

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

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

『捌』 php中子類只能繼承一個父類,然而父類可以多個子類,這樣理解對嗎

PHP只支持單繼承,但是基類也就是父類下面可以有多個子類

比如一般的MVC里的模型父類和控制器父類

都是這樣一個形式

『玖』 php中靜態類的繼承

樓主這個問題跟靜態沒有多大關系,主要是繼承的概念沒有搞清楚,繼承一個類是將子類擁有了調用父類的方法和屬性的權利,並不是說將父類的方法復制到了子類中self方法相當於當前類的指針,你那樣調用相當於寫了
public static function test() {
parent::who();
}
這樣的代碼,所以才會出現那樣的結果

『拾』 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();執行。

熱點內容
linux軟體測試 發布:2025-07-04 20:12:40 瀏覽:273
小數加減法計演算法則 發布:2025-07-04 20:11:49 瀏覽:691
文件如何定時上傳至伺服器 發布:2025-07-04 20:06:17 瀏覽:860
菜鳥商城源碼 發布:2025-07-04 20:01:31 瀏覽:446
英雄聯盟頭像文件夾 發布:2025-07-04 19:49:59 瀏覽:580
取消電腦連接wifi密碼怎麼設置密碼 發布:2025-07-04 19:31:32 瀏覽:508
電腦伺服器市場 發布:2025-07-04 19:14:06 瀏覽:504
沒簽名只加密 發布:2025-07-04 18:54:38 瀏覽:255
紅米手機存儲問題 發布:2025-07-04 18:50:43 瀏覽:845
水電煤演算法 發布:2025-07-04 18:36:44 瀏覽:330