談談php繼承的那些事(php是單繼承還是多繼承)

本文目錄一覽:

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

我來說一說:

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

class a{

public $var = ‘var a br/’;

public function m(){

echo ‘fun a br/’;

}

public function run(){

echo $this-var;

$this-m();

}

}

class b extends a{

public $var = ‘var b br/’;

public function m(){

echo ‘fun b br/’;

}

}

$li = new b();

$li-run();

echo ‘hr’;

var_dump($li);

輸出:

var b 

fun b 

————————————————————————————

object(b)[1]

  public ‘var’ = string ‘var b br/’ (length=11)

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

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

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

class a{

private $var = ‘var a br/’;

private function m(){

echo ‘fun a br/’;

}

public function run(){

echo $this-var;

$this-m();

var_dump($this);

echo ‘br/br/’;

}

}

class b extends a{

private $var = ‘var b br/’;

private function m(){

echo ‘fun b br/’;

}

public function run(){

echo $this-var;

$this-m();

var_dump($this);

echo ‘br/br/’;

parent::run();

}

}

$li = new b();

$li-run();

echo ‘hr’;

var_dump($li);

輸出:

var b 

fun b 

object(b)[1]

  private ‘var’ = string ‘var b br/’ (length=11)

  private ‘var’ (a) = string ‘var a br/’ (length=11)

.

.

var a 

fun a 

object(b)[1]

  private ‘var’ = string ‘var b br/’ (length=11)

  private ‘var’ (a) = string ‘var a br/’ (length=11)

.

————————————————————————————————

object(b)[1]

  private ‘var’ = string ‘var b br/’ (length=11)

  private ‘var’ (a) = string ‘var a br/’ (length=11)

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

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

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

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

class a{

private $var = ‘var a br/’;

private function m(){

echo ‘fun a br/’;

}

}

class b extends a{

public function run(){

echo $this-var;

$this-m();

}

}

$li = new b();

$li-run();

輸出:

Notice: Undefined property: b::$var in E: … on Line 9

Fatal error: Call to private method a::m() from context ‘b’ in E: … on Line 10

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

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中靜態類的繼承

樓主這個問題跟靜態沒有多大關係,主要是繼承的概念沒有搞清楚,繼承一個類是將子類擁有了調用父類的方法和屬性的權利,並不是說將父類的方法複製到了子類中self方法相當於當前類的指針,你那樣調用相當於寫了

public static function test() {

parent::who();

}

這樣的代碼,所以才會出現那樣的結果

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/152931.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:07
下一篇 2024-11-13 06:08

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種數據庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論