繼承並不會改變類別的結構。而是表名了兩個類別之間存在著某種關係,使得其中的成員看起來像是在別的類別中存在。
主要的語法流程是:但我們new一個物件時,會在資料區先開闢一個儲存空間,然後將物件進行初始化。初始化時,先是在其物件所對應的類別空間去找變數或方法,當無法找到時,如果發現其有一個繼承關係,則會接著去它的父類別中尋找。因此,我們所說的繼承並不會改變累的結構,只是在兩個繼承類別之間多了一個繼承的關係。 (比如說重寫操作:當子類別和父類別中有相同的方法名稱是,掉用函數,先找的是當前物件對應類別中的方法,當找到後就不會繼續尋找了。這時,我們看起來像是父類別中的方法被覆蓋了,這就是重寫的概念)。
<?php header("Content-Type:text/html;charset=utf-8"); Class A { public $p1=1; const c1=3; static $d1=5; private $e1=7; function f1(){ echo "我是A中的方法!"; } } Class B extends A{ public $p2=2; const c2=4; static $d1=6; private $e2=8; function f1(){ echo "我是B中的方法!".$this->e1; echo "我是B中的方法!".$this->e2; } } $o1=new B(); var_dump($o1); echo "<br/>"; $o1->f1(); echo "<br/>"; A::f1();//此处不建议这么写,这是不严格的语法。 echo "<br/>"; ?>
注意:var_dump($o1)中有變數e1的值,並且標示了「 ["e1":"A ":private]=> int(7)”,這顯示了私有屬性也可以被繼承類別B中呼叫變數e1是,會顯示未定義變數。這說明靜態變數雖然可以被繼承,但是能呼叫它的只有它所在的類別(子類別雖能繼承,但無法呼叫)。
<?php header("Content-Type:text/html;charset=utf-8"); Class A { public $p1=1; const c1=3; static $d1=5; private $e1=7; function f1(){ echo "我是A中的方法!".self::$d1; } } Class B extends A{ public $p2=2; const c2=4; static $d2=6; private $e2=8; function f1(){ echo "我是B中的方法!".self::$d1; //echo "我是B中的方法!".self::$d2; } } echo "<br/>"; echo "类B中的静态属性d2:".B::$d2; echo "<br/>"; echo "类B中能否继承父类A中的静态属性d1:".B::$d1; echo "<br/>"; echo "类A中的静态属性d1:".A::$d1; echo "<br/>"; echo "类A中能否访问子类B中的静态属性d2:".A::$d2;
從中我們可以看出,子類別中可以存取到父類別中的靜態屬性,但是父類別無法得到子類別中的靜態屬性。因為系統在執行過程中是「從下至上」的查找過程,先從目前類別中找,如果找不到,就向上以層(父類)查找。而父類別不能向下一級(子類別)查找。
注意:靜態屬性並不和普通的屬性一樣,存在於物件的資料空間中。
最後,從兩個實例可得:繼承並未改變其中類別的任何結構。只是物件中有了父類別的一些東西。並且可以從父類別呼叫函數。 (簡單來說就是當創建物件時,一些能夠儲存的資料都會儲存在目前物件所建立的資料儲存區中,後面透過物件的一些操作都是在該資料儲存區中進行的,與我們前面所寫的類別沒有直接關係。
以上是PHP中繼承實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!