類別繼承很重要,身為程式設計師基本上每天都會和他打交道,但是有些東西你真的都知道嗎?下面是從官網上面看到的。
一個類別可以在宣告中用 extends,關鍵字繼承另一個類別的方法和屬性。 PHP不支援多重繼承,一個類別只能繼承一個基底類別。
被繼承的方法和屬性可以透過用同樣的名字重新宣告來覆寫。但是如果父類別定義方法時使用了 final,則該方法不可被覆寫。可以透過 parent:: 來存取被覆寫的方法或屬性。
當覆寫方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 層級的錯誤訊息。但建構子例外,建構子可在被覆寫時使用不同的參數。
關於基本的概念想必大家都會知道,但是對於final和parent::在專案中我還真沒有怎麼使用過,慚愧啊。
下面主要說一下這兩個關鍵字的用途吧。
Final 關鍵字
PHP 5新增的關鍵字,如果父類別中的方法宣告為 final,則子類別無法覆寫該方法。同樣如果一個類別被宣告為 final,則不能被繼承。
要注意的是: 屬性不能被定義為 final,只有類別和方法才能被定義為 final。
範圍解析運算子(::)
範圍解析運算子或更簡單地說是一對冒號,可以用來存取靜態成員,類別常數,也可以用來覆寫類別中的屬性和方法。
self,parent 和 static 這三個特殊的關鍵字是用於在類別定義的內部對其屬性或方法進行存取的。
當子類別覆寫其父類別中的方法時,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()! /** * 输出结果 -> * 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類別繼承的全部實作步驟。
以上是php繼承類別 extends用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!