1. 程式人生 > >5:繼承的概念&許可權修飾屬性得繼承

5:繼承的概念&許可權修飾屬性得繼承

繼承

繼承是以一個類為父類,另一個類作為它的子類,子類在繼承了父類的屬性和方法的基礎上,還可以進一步的拓展,例如增加或修改屬性或方法

  • 語法:在子類宣告的地方加入extends [父類名],也就是[Zilei] extends [父類名];
  • 當前子類,就擁有了父類的屬性和方法,除了private屬性方法除外,許可權修飾符的作用再一次體現,僅在當前類中可被訪問;
  • 一個類只能繼承一個父類,不能是多個類;

示例:

class Ren{
	private $height = 160;
	public function ku(){
		echo '學生哭了555555555<br/>';
	}
}

class Xuesheng extends Ren{
	public function xiao(){
		echo '學生笑了<br/>';
	}
}

$a = new Xuesheng();
$b = new Ren();
$a->ku();
$a->xiao();
$b->ku();
$b->xiao();//xiao not found!

關於private繼承的問題

  • 說法一:private屬性或方法不能被繼承,可以通過一些特別的寫法,達到讀寫父類私有屬性得目的,但是他還是不能被繼承;
  • 說法二:private屬性或方法可以被繼承,但是不可訪問,可以通過一些特別的寫法,達到讀寫目的;
  • 最終結論:不管哪一種說法,反正private屬性是不能在子類中直接愉快的使用的,記住這一點就OK了;

三個屬性修飾,那些會被繼承

  • public,protected,private

  • public,protected可以被直接繼承,並擁有讀寫許可權;

  • private不能被直接繼承,無法進行讀寫;

  • 證明:private屬性和方法會被繼承:

class Ren {
	private $name = '小甜甜';
}
class Stu extends Ren{
	private $name = '雞爪';
}
$lilei = new Stu();
print_r($lilei);//Stu Object ( [name:Stu:private] => 雞爪 [name:Ren:private] => 小甜甜 )
  • 證明了父類的私有屬性,確實會被繼承

  • 最終一個子類繼承的結構是這樣的:

class A {
	public $name = null;
	private $money = null;
}

class B extends A{
	public $income = null;
	private $weight = 76;
}
$張三 = new B();

//張三最終的結構:
張三:{
	A:{
		private $money屬性,
		B:{
			private $weight屬性,
			public $name屬性,
			public $income屬性
		}
	}
}

繼承了那些東西?

  • 繼承了父類的public/protected屬性和方法,完全繼承,屬於子類,可讀可寫;
  • 繼承了父類的private屬性和方法,但不可讀不可寫;

子類可以做什麼擴充?

  • 屬性/方法,可以修改或增加
  • 同名屬性,方法,可以直接被重寫
  • 子類繼承了父類的屬性和方法之後,想要重寫屬性,那麼許可權修飾符只能越來越寬鬆或相等,不能更嚴格;

建構函式如何繼承的?

  • 首先父類的建構函式是會被繼承的。
  • 繼承父類的建構函式時,如果父類的某些方法依賴於父類的建構函式執行後返回的結果作為引數,那麼為了確保繼承過來的父類的方法正常執行,應該在子類重寫父類建構函式時,先執行一下父類的建構函式:parent::__construct(),parent不能呼叫父類的private許可權的方法;
  • 與其他語言中不同點是:在Java中,例項化子類時,父類的建構函式會執行,而且會先於子類的建構函式執行,然後才是子類的建構函式執行;
  • 在PHP中,如果子類沒有寫建構函式,則直接使用父類建構函式,如果子類寫了建構函式,則執行子類建構函式,父類建構函式不會執行,子類中可以手動呼叫父類的建構函式;

許可權修飾符總結

public,protected,private

範圍 public protected private
類內 可以訪問 可以訪問 可以訪問
類外 可以訪問 不可訪問 不可訪問
子類 可以訪問 可以訪問 不可訪問