如何定義PHP中的類及其成員屬性

來源:互聯網
上載者:User
類的概念:類是具有相同屬性和操作的一組對象的集合。它為屬於該類的所有對象提供了統一的抽象描述,其內部包括屬性和操作兩個主要部分。在物件導向的程式設計語言中,類是一個獨立的程式單位,它應該有一個類名並包括屬性說明和操作說明兩個主要部分。

1、類的定義:

i. 類的關鍵字定義使用class

1.定義一個空類

Class Person{};

2.定義一個有成員屬性和操作的類

Class Person{成員屬性........操    作........}

3.定義一個不能被繼承的類,使用final關鍵字

Final class Person{成員屬性........操    作........}

4.注意:final關鍵字不能用來修飾成員屬性 ,只能修飾類和方法(final方法後面介紹)

5.這裡舉一個帶有final的class

定義一個final的類FinalClass,包含一個公用函數

final class FinalClass {public function ffun() {echo “本類為final類”;}}

定義一個類ChildFinalClass 並繼承FinalClass 類

class ChildFinalClass extends FinalClass {public function fchildfun() {echo ‘本類繼承final類FinalClass ’;}}

這樣當執行以上命令的時候系統會提示

Fatal error: Class ChildFinalClass may not inherit from final class (FinalClass)

證明由final關鍵字定義的class是不可以被子類繼承的

2、類中成員屬性的定義

i. 成員屬性就是對該類定義的一些變數屬性,那人作為一個類來說,人都有一對眼睛(正常的啊,二郎神除外),一張嘴,兩個耳朵,等這樣的一些固定的用來描述或表現某種事物的專有名詞稱為成員屬性

ii. 類中成員屬性的聲明使用的關鍵字

iii. 常見成員屬性聲明是由關以下鍵字

public,var,protected,private開頭的,然後跟一個變數來組成的。還有一些成員屬性包括,靜態static,常量const.

Public: 表示全域的,類內部外部子類都可以訪問

Var: php 5 版本中會認為這個成員屬性為public類型的屬性

protected 表示受保護的,只有本類或子類或父類中可以訪問

private 表示私人的,只有本類內部可以使用

Static: 1)靜態屬性,

2)用static修飾的成員屬性可以被同一個類的所有對象共用

3) 靜態資料是在類第一次被載入的時候就存在了記憶體中的資料區段中(初始化靜態段)

4)類中使用self::成員屬性名

5)類外 類名::成員屬性名

Const: 1)類中常量屬性,在類中聲明常量必須使用const

2)類中使用 self::成員屬性名

3)類外使用 類名::成員屬性名

注意:屬性中的變數可以初始化,但是初始化的值必須是常數,這裡的常數是指php指令碼在編譯階段時就為常數,而不是在編譯階段之後在運行階段運算出的常數。例如,不能包含任何運算子,不能是任何變數,不能是一個函數等。

iv. 成員屬性的調用方式:

在類的成員方法裡面,可以通過 $this->property(property是屬性名稱字)這種方式來訪問類的屬性、 方法,但是要訪問類的靜態屬性或者在靜態方法裡面卻不能使用,而是使用 self::$property。 在類的非靜態方法裡面可以使用偽變數 $this,這個偽變數是調用該方法的執行個體化對象引用。

接下來用代碼對上面的內容做一下解釋:

class FinalClass {//static $a = strTolower();   //這種寫法錯誤//const  A = 1+2;              //這種寫法錯誤//public $name = 123+456;     //這種寫法錯誤static $a = '$a';const  A = 'A';public $name = '鳳姐';protected $sex = '男+女';private $age = 23;}class ChildFinalClass extends FinalClass{public function fchildfun(){echo 'ChildFinalClass類中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";Echo 'ChildFinalClass類中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";echo '大家好,我叫'.$this->name."<hr>";echo '我是:'.$this->sex.'生<hr>';echo '我今年:'.$this->age.'<hr>';   //由於age是私人的成員屬性,所以在這裡將不會被調用,將提示沒有定義此屬性在ChildFinalClass類中。 }}$obj = new ChildFinalClass();$obj->fchildfun();

3、類中操作的定義

i. 我本人一般喜歡叫操作為成員方法,以下我會叫操作為方法其實都是一樣的

ii. 成員方法的定義:成員方法就是對該類定義的一些函數方法,比如拿這個類來例句例子,人能吃飯,能跑步,能敲代碼,這就是成員方法。也就是可以做一些可執行性的動作我們理解為成員方法

iii. 成員方法的訪問和成員屬性一樣可以參照上面成員屬性的訪問介紹。

iv. 成員方法和成員屬性一樣也包括public,protected,private,static,final並且範圍也是一樣的,接下來舉一些例子供大家參考和理解。

v. 靜態成員方法只能訪問靜態成員屬性和成員方法,並且類內部訪問靜態方法可以使用self::靜態方法(), 類外部存取使用類名::靜態方法()

1. 自訂方法:

class FinalClass {static $a = '$a';const  A = 'A';public $name = '鳳姐';protected $sex = '男+女';private $age = 23;     //定義一個公用方法public function publickfun(){echo 'FinalClass類中self::$a->'.self::$a."<hr>";echo "FinalClass類中self::A->".self::A."<hr>";echo '大家好,我叫:'.$this->name."<hr>";echo '我是:'.$this->sex.'生<hr>';echo '我今年:'.$this->age.'<hr>';} //定義一個受保護的方法protected function protectedfun(){echo 'FinalClass類中self::$a->'.self::$a."<hr>";echo "FinalClass類中self::A->".self::A."<hr>";echo '大家好,我叫:'.$this->name."<hr>";echo '我是:'.$this->sex.'生<hr>';echo '我今年:'.$this->age.'<hr>';}    //定義一個私用方法private function privatefun(){echo 'FinalClass類中self::$a->'.self::$a."<hr>";echo "FinalClass類中self::A->".self::A."<hr>";echo '大家好,我叫:'.$this->name."<hr>";echo '我是:'.$this->sex.'生<hr>';echo '我今年:'.$this->age.'<hr>';}}class ChildFinalClass extends FinalClass{public function fchildfun(){echo 'ChildFinalClass類中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>"; Echo 'ChildFinalClass類中ChildFinalClass::A->'.ChildFinalClass::A."<hr>"; echo '我是:'.$this->sex.'生<hr>'; echo '我今年:'.$this->age.'<hr>';   //由於age是私人的成員屬性,可以理解為我不想讓別人知道我的年齡,所以在這裡將不會被調用,將提示沒有定義此屬性在ChildFinalClass類中。 $this->publickfun(); $this->protectedfun(); $this->privatefun();            //由於privatefun是私人的成員方法,所以在這裡將不會被調用。}}$obj = new ChildFinalClass();$obj->fchildfun();

2.魔術方法

i. 魔術方法必須被定義為公用的,所有其他魔術方法都必須如此

ii. 從PHP 5以後的版本,PHP中的類就可以使用魔術方法了。其規定以兩個底線()開頭的方法都保留為魔術方法,所以建議大家函數名最好不用開頭,除非是為了重載已有的魔術方法,接下來列出一些魔術方法,如果大家想詳細瞭解可以針對某一個進行查詢瞭解,這裡就不大篇幅的介紹了。

1、construct() 構造方法

destruct()

析構方法

2、clone()

如果想複製一個對象則需要使用clone方法

3、toString()

方法在將一個對象轉化成字串時自動調用,比如使用echo列印對象時

4、sleep() 序列化的時候用

wakeup 反序列化的時候調用

5、 set_state()

當調用var_export()時,這個靜態 方法會被調用(自PHP 5.1.0起有效)

6、invoke(PHP 5.3.0以上版本有效)

當嘗試以調用函數的方式調用一個對象時,invoke 方法會被自動調用。

7、callStatic(PHP 5.3.0以上版本有效) 是為了處理靜態方法調用

8、get() 當調用一個未定義的屬性時,此方法會被觸發,傳遞的參數是被訪問的屬性名稱。

set() 給一個未定義的屬性賦值時,此方法會被觸發,傳遞的參數是被設定的屬性名稱和值。 這裡的沒有聲明包括當使用對象調用時,存取控制為proteced,private的屬性(即沒有許可權訪問的屬性)。

9、isset() 當在一個未定義的屬性上調用isset()函數時調用此方法

unset() 當在一個未定義的屬性上調用unset()函數時調用此方法

10、call( $method, $arg_array )

當調用一個未定義的方法是調用此方法

這裡的未定義的方法包括沒有許可權訪問的方法;如果方法不存在就去父類中找這個方法,如果父類中也不存在就去調用本類的call()方法,如果本類中不存在call()方法就去找父類中的call()方法。

11、autoload() 自動載入魔術方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.