1. 程式人生 > >php類繼承extends 使用介紹

php類繼承extends 使用介紹

轉載自:http://www.jb51.net/article/45686.htm

出來工作這麼久了,專案經驗倒是不少,但是當問及底層的東西時候,常常是一言不發了。現在專案設計底層的東西越來越少,可以說是真正用到的也就是那麼一點,真正核心的東西都已經被框架封裝好了。總感覺自己一直進步很慢,關於底層設計思想,常常也只可意會。隨著時間的流逝,我們常常會感慨書到用時方恨少了,接下來一定要惡補設計思想了。

今天先來複習一下類繼承。

類繼承很重要,作為程式設計師也基本每天都會和他打交道,但是有些東西你真的都知道嗎?下面是從官網上面看到的。

一個類可以在宣告中用 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 使用介紹

轉載自:http://www.jb51.net/article/45686.htm 出來工作這麼久了,專案經驗倒是不少,但是當問及底層的東西時候,常常是一言不發了。現在專案設計底層的東西越來越少,可以說是真正用到的也就是那麼一點,真正核心的東西都已經被框架封裝好了。總

PHP繼承、接口繼承關系概述

con ted 概述 類型 類繼承 trac 派生 直接 5.6 PHP類繼承: PHP類不支持多繼承,也就是子類只能繼承一個父類,但是支持多層次繼承,比如: 1 class frist{ 2 public function __construct(){

PHP繼承、介面繼承關係概述

PHP類繼承: PHP類不支援多繼承,也就是子類只能繼承一個父類,但是支援多層次繼承,比如: 1 class frist{ 2 public function __construct(){ 3 echo "我是第一個類。","<br>"; 4 } 5

php繼承設計商品手機圖書

設計如下幾個類:商品類,有名稱,有價錢,庫存數,可顯示自身資訊(名稱,價錢,庫存)。手機類,是商品的一種,並且有品牌,有產地,可顯示自身資訊。圖書類,是商品的一種,有作者,有出版社, 可顯示自身資訊。建立一個手機物件,並顯示其自身資訊;建立一個圖書物件,並顯示其自身資訊;擴

scala 基礎九 scala 的擴展和繼承extends override

rgs 繼承 res div cal def ack obj extends 1.scala 類的繼承 package smart.iot //父類 animal 有三個參數 class animal(var name:String,var age:Int

PHP 繼承 訪問修飾符 重寫

很多 strong 類的方法 重新 特征 -s 基本 ted 屬性 類的繼承: 某些類A具有的某些特性,另一個類B,也具有A類的所有特性並且也有自己的特性,此時我們就可以實現B類使用A類的特性信息並繼續添加自己的一些特有的特征信息 關鍵字是:extends基本概念:

【Java篇03】具體 & 抽象 & 介面 —— 繼承extends & 實現Implement小結

一、具體類 & 抽象類 $ 介面 從組成上來看: 具體類包含:屬性、構造器、具體方法、初始化塊(靜態語句塊static{ } 、動態語句塊{ })、內部類 ; 抽象類包含:屬性、構造器、具體方法、抽象方法(需要用public abstract修飾); 介面包含:屬性、抽象方法(一

php的單繼承和trait的使用,實現多繼承效果

一、php類名規範: 1>類名可包含字母,數字,下劃線,不能以數字開頭; 2>類名不區分大小寫; 3>類名不能使用關鍵字; 4>類檔案都以.class.php為字尾,使用駝峰法命名,並且首字母大寫; 二、例項化類和繼承 1>class 宣告的類使用new關鍵

關鍵字 extends 繼承

類繼承語法規則: < 修飾符> class < 子類名稱> [extends < 父類>] { <屬性和方法的宣告> }   Java只支援單繼承,不允許多重繼承 一個子類只能有一個父類 一個父類可以派生出多個子類   子類繼承

PHP JpGraph庫的介紹以及基本用法

JpGraph是一個面向物件的圖形建立庫,用於PHP5(> = 5.1)和PHP7.0該庫完全用PHP編寫,可以在任何PHP指令碼中使用(支援CGI / APXS / CLI版本的PHP),現在最新的版本是4.2.6( JpGraph 4.x系列支援PHP5(PHP 5.1.0或更

php的介面的繼承

一個介面可以繼承自另外的介面。PHP5中的類是單繼承,但是介面很特殊。一個介面可以繼承自多個介面。 一個介面繼承其它介面時候,直接繼承父介面的靜態常量屬性和抽象方法。 在PHP5中,介面是可以繼承自另外一個介面的。這樣程式碼的重用更有效了。 要注意只有介面和介面之間使用 繼

PHP 中的靜態變數的繼承

        在此我首先執行一段小程式,先不去直接講出靜態變數的繼承在PHP中語法規則,for  example:     class Base{           public $a;    

介面(interface),實現(class),繼承(extends),實現(implements)

介面類: @Service public interface AppCertMsgService { public Map<String, Object> saveCardMsg(AppCertMsg appCertMsg, String channe

php的封裝、繼承和多型的簡單理解

面象對向的三大特點:封裝性、繼承性、多型性 首先簡單理解一下抽象: 我們在前面定義一個類的時候,實際上就是把一類事物共有的屬性和行為提取出來,形成一個物理模型(模版),這種研究問題的方法稱為抽象 一、封裝性  封裝就是把抽取出來的資料和對資料的操作封裝在一起,資料被保護在內

PHP繼承方法如何獲取子名?get_class() 和 get_called_class()

    PHP裡的__CLASS__這類東西是靜態繫結的,如果不在子類裡過載的話,那麼繼承父類方法所得到的依舊是父類的名稱,而不是子類的名稱,比如: 01 <?php 02 cla

PHP繼承和介面

PHP類的繼承的一些語法 -PHP的類只支援單繼承,就是每個類最多隻能有一個父類或者沒有父類。 -子類不能繼承父類使用private修飾的成員。 修飾符 可訪問範圍 public 當前類、子類和類外 protecte

[PHP]的引用和繼承

寫在前面:      我是一個小小的程式設計師,我的野心是成為一個全棧工程師!!! 正文:     因為有朋友想要了解下PHP的類的引用和繼承是怎樣的,所以寫個示例,如下: <?php /**********************************

繼承extends與 抽象 abstract

繼承的父子成員特點子類繼承父類:  1:子類可以訪問父類的非私有成員  2:可以在子類中新增子類特有成員繼承的作用 1)繼承可以提供程式碼的複用性:父類中的一個方法,所有的子類的都用 2)提供了程式的可擴充套件性1:Java支援單繼承  a:一個子類只能有一個父類(一個兒子只

C#中流寫入StreamWriter的介紹

() virtual || 寫入 lock object 字符 html 更改 C#中流寫入類StreamWriter的介紹 (轉) 應用FileStream類需要許多額外的數據類型轉換工作,十分影響效率。使用StreamWriter類將提供更簡單,更方便的操作方式。

繼承後想要擴展父方法

保留 回調 gen obj pcl logs col 父類 sel 1 >>> class PClass(object): 2 def setInfo(self,sex=‘Male‘): 3 self.gender = se