首頁 >後端開發 >php教程 >PHP中繼承實例詳解

PHP中繼承實例詳解

小云云
小云云原創
2018-03-31 09:55:081398瀏覽

繼承並不會改變類別的結構。而是表名了兩個類別之間存在著某種關係,使得其中的成員看起來像是在別的類別中存在。

主要的語法流程是:但我們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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:PHP中重載詳解下一篇:PHP中重載詳解