出來工作這么久了,項目經驗倒是不少,但是當問及底層的東西時候,常常是一言不發了。現在項目設計底層的東西越來越少,可以說是真正用到的也就是那么一點,真正核心的東西都已經被框架封裝好了。總感覺自己一直進步很慢,關于底層設計思想,常常也只可意會。隨著時間的流逝,我們常常會感慨書到用時方恨少了,接下來一定要惡補設計思想了。
今天先來復習一下類繼承。
類繼承很重要,作為程序員也基本每天都會和他打交道,但是有些東西你真的都知道嗎?下面是從官網上面看到的。
一個類可以在聲明中用 extends,關鍵字繼承另一個類的方法和屬性。PHP不支持多重繼承,一個類只能繼承一個基類。
被繼承的方法和屬性可以通過用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時使用了 final,則該方法不可被覆蓋??梢酝ㄟ^ parent:: 來訪問被覆蓋的方法或屬性。
當覆蓋方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 級別的錯誤信息。但構造函數例外,構造函數可在被覆蓋時使用不同的參數。
關于基本的概念想必大家都會知道,但是對于final和parent::在項目中我還真沒有怎么使用過,慚愧啊。
下面主要說一下這兩個關鍵字的用途吧。
Final 關鍵字
PHP 5新增的一個關鍵字,如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。同樣如果一個類被聲明為 final,則不能被繼承。
需要注意的是: 屬性不能被定義為 final,只有類和方法才能被定義為 final。
范圍解析操作符(::)
當一個子類覆蓋其父類中的方法時,PHP 不會調用父類中已被覆蓋的方法。是否調用父類的方法取決于子類。這種機制也作用于構造函數和析構函數,重載以及魔術方法。
下面是調用父類的方法的一個示例:
- <?php
- class MyClass
- {
- protected function myFunc() {
- echo "MyClass::myFunc()/n";
- }
- }
- class OtherClass extends MyClass
- {
- // 覆蓋了父類的定義
- public function myFunc()
- {
- // 但還是可以調用父類中被覆蓋的方法
- parent::myFunc();
- echo "OtherClass::myFunc()/n";
- }
- }
- $class = new OtherClass();
- $class->myFunc();
- /**
- * 輸出結果 ->
- * MyClass::myFunc()
- * OtherClass::myFunc()
- */
- ?>
當在類定義之外引用到這些項目時,要使用類名。
::class 自 PHP 5.5 起,關鍵詞 class 也可用于類名的解析。使用 ClassName::class 你可以獲取一個字符串,包含了類 ClassName 的完全限定名稱。這對使用了 命名空間 的類尤其有用。這些可能就是以后要討論的話題了,關于這個概念那就是以后要討論的了,現在我們還在使用php5.3。
不過說句實話,有一些關鍵字在小項目中確實是很難使用,不過我想多了解一些總還是需要的。尤其是當你使用一些第三方的類庫時候,當你細細研究他的程序邏輯,你總能學點東西。盡管有些東西你長時間不用,可能就忘記了,但是畢竟他曾經在你腦海里經過過,總會為以后的人生留點痕跡。
最后廢話不多說了,分享一段范圍解析操作符(::)應用的代碼,你們也來感受下:
- <?php
- class cA
- {
- /**
- * 直接使用的測試屬性的默認值
- */
- protected static $item = 'Foo';
- /**
- * 間接使用的測試屬性的默認值
- */
- protected static $other = 'cA';
- public static function method()
- {
- print self::$item."/r/n";
- print self::$other."/r/n";
- }
- public static function setOther($val)
- {
- self::$other = $val;
- }
- }
- class cB extends cA
- {
- /**
- * 重定義測試屬性的默認值
- */
- protected static $item = 'Bar';
- public static function setOther($val)
- {
- self::$other = $val;
- }
- /**
- * 不重新聲明 method()方法
- */
- }
- class cC extends cA
- {
- /**
- * 重定義測試屬性的默認值
- */
- protected static $item = 'Tango';
- public static function method()
- {
- print self::$item."/r/n";
- print self::$other."/r/n";
- }
- /**
- * 不重新聲明 setOther()方法
- */
- }
- class cD extends cA
- {
- /**
- * 重定義測試屬性的默認值
- */
- protected static $item = 'Foxtrot';
- /**
- * 不重新聲明 任何方法來實現上述過程
- */
- }
- cB::setOther('cB'); // cB::method()!
- cB::method(); // cA::method()!
- cC::setOther('cC'); // cA::method()!
- cC::method(); // cC::method()!
- cD::setOther('cD'); // cA::method()!
- cD::method(); // cA::method()!
- //Vevb.com
- /**
- * 輸出結果 ->
- * Foo
- * cB
- * Tango
- * cC
- * Foo
- * cD
- */
- ?>
PHP extends類繼承代碼示例:
- < ?php
- class a{
- public $x;
- public $y;
- function __construct($x=0,$y=0){
- $this->x=$x;
- $this->y=$y;
- }
- function getx(){
- return $this->x;
- }
- function gety(){
- return $this->y;
- }
- function __destruct(){}
- }
- class a2 extends a{}
- /*extends是一個繼承函數*/
- $b2=new a2(10,10);
- echo $b2->getx()."<br>";
- echo $b2->gety();
- ?>
以上介紹的內容就是PHP extends類繼承的全部實現步驟。
新聞熱點
疑難解答