類的結構: 類的內部能可能有三種東西,就是常量(constant),屬性(property)和方法(method),功能可以理解成類外部的常量,變數和函數。
代碼如下:
<?php class TEST { const NAME = 'value'; // 常量 public $name = 'value'; // 屬性 public function name() // 方法 { echo 'value'; } } ?>
在這之中,屬性和方法又可以使用public, protected, private三個不同的關鍵字來將屬性和方法的作用範圍做進一步的區分,帶有private關鍵字的屬性和方法,只有所在的類中的方法才能調用;帶有protected關鍵字的屬性和方法,除了自己以外,自己的父類和子類中的方法也可以調用;帶有public關鍵字的屬性和方法,則可以從執行個體化以後的對象中進行調用,這樣做最大的好處給所有的屬性和方法增加了一些描述的特徵,更便於整理和組織代碼的結構。const關鍵字先跳過,和後面的static一起講。
static關鍵字是有別於public, protected, private的另一類型關鍵字(因此可以和public, protected, private疊加起來使用):
代碼如下:
<?php class TEST { public static function name() { echo 'value'; } } ?>
帶有static關鍵字的方法,可以在不對類進行執行個體化的情況下直接通過“::”符號調用,和public, protected, private的搭配,也可以讓調用區分許可權,但是一般都是和public搭檔,前面提到的常量關鍵字const,應該就是public static類型的,因此只能通過self::NAME,TEST::NAME這樣的形式調用常量,後面的__construct,__destruct等方法,都是屬於static。
類的結構部分,最後介紹的兩個關鍵字是abstract和final,abstract關鍵字表示這個類必須被他的子類覆寫,而final關鍵字表示這個類必須不能被他的子類覆寫,這兩個關鍵字的功能是正好相反的,帶有abstract的方法被成為抽象方法,帶有抽象方法的類,成為抽象類別,這個在後面還有介紹。
類的使用:
類的使用主要有兩種方法,一種是使用new關鍵字,另一種是使用“::”符號:
PHP代碼
代碼如下:
<?php class TEST { public static function name() { echo 'value'; } } //方法1:使用new關鍵字 $test = new TEST; $test->name(); //方法2:使用“::”符號 TEST::name(); ?>
(1):使用new關鍵字成為執行個體化,上面的$test就是一個通過TEST類執行個體化而產生的對象,$test->name()稱為調用$test對象的name方法。
(2):使用new關鍵字使用類的時候,可以使用$this來指代類本身。
(3):使用“::”符號的前提是方法必須是帶有static關鍵字的,使用new關鍵字時,被調用的方法,必須帶有public關鍵字(一個方法如果不帶public, protected, private中的任何一個關鍵字,則預設為public)
(4):同一個類可以通過new關鍵字被執行個體成多個不同的對象,但是彼此之間的是隔離的;“::”符號在使用的時候,方法在多次使用之間,是共用的:
PHP代碼
代碼如下:
<?php class TEST1 { public $name = 0; public function name() { $this->name = $this->name + 1; } } $test1 = new TEST1; $test2 = new TEST1; $test1->name(); //$name1 == 1 $test2->name(); //$name1 == 1 /*--------------------------------------------*/ class TEST2 { public static $name = 0; public static function name() { TEST2::$name = TEST2::$name + 1; } } TEST2::name(); // $name == 1 TEST2::name(); // $name == 2 ?>
類的關係:
類與類之間的關係,主要有抽象,介面和繼承:
PHP代碼
代碼如下:
<?php abstract class TEST1 // 抽象 { abstract public function name1(); public function name2() { } } class TEST2 extends TEST1 implements TEST3 // 繼承 { public function name1() { } } interface TEST3 // 介面 { public function name2(); } ?>
(1)帶有abstract關鍵字的類是抽象類別,帶有abstract關鍵字的方法是抽象方法,抽象類別中的抽象方法,必須在子類中被覆寫。
(2)帶有interface關鍵字的類,就是介面,介面不允許實現任何的方法,介面中所有的方法,都必須在子類中被覆寫。
(3)帶有 classA extends classB 或者 classA implements classB 字樣的就是繼承,extends表示繼承另一個類,implements表示繼承另一個介面,一次只能extends一個類,但是可以implements多個介面。
(4)抽象類別,介面,以及最終繼承並實現的方法,都必須是public的。
在繼承的過程中,子類會覆寫父類的同名方法,這個時候如果需要在子類中調用父類的方法,可以使用parent關鍵字或者類名加上“::”符號調用:
PHP代碼
代碼如下:
<?php class TEST1 extends TEST2 { public function name() { echo parent::name2(); echo TEST2::name2(); } } class TEST2 { public function name2() { echo 'value2'; } } $test = new TEST1; $test->name(); ?>
這裡再解釋一下“::”方法在類中的作用,一個作用是在沒有執行個體化的情況下調用常量(其實也理解成static就可以了),static屬性和方法,再一個是在類的內部,通過self,parent和類名建立便捷的調用通道。
對象於對象之間的關係,主要是“==”等於,“===”全等於,不等於和clone:
PHP代碼
<?php class TEST { public function name() { } } $test1 = new TEST; $test2 = new TEST; $test3 = $test1; echo $test1 == $test2 ? true : false; // true echo $test1 == $test3 ? true : false; // true echo $test2 == $test3 ? true : false; // true echo $test1 === $test2 ? true : false; // false echo $test1 === $test3 ? true : false; // true echo $test2 === $test3 ? true : false; // false ?>
(1)兩個類只要擁有相同的屬性和方法,就是“==”等於。
(2)兩個類必須是指向的同一個對象,才能是“===”全等於。
clone比較特殊,在上面的例子中,$test3 = $test1的過程並不是給了 $test3 一份 $test1 對象的拷貝,而是讓 $test3 指向了 $test1,如果一定要獲得一份$test1的拷貝,就必須使用clone關鍵字:
PHP代碼
代碼如下:
<?php $test3 = clone $test1; ?>
類的鉤子:
__autoload:
是一個函數名,也是唯一一個在類的外部使用的鉤子,在執行個體化一個對象的時候,如果沒有預先載入類,就會調用這個鉤子。
__construct
在類被執行個體話的時候,被調用的鉤子,可以做一些初始化的操作。
__destruct
在類被銷毀的時候,被調用的鉤子。
__call
當對象試圖調用一個不存在的方法的時候,被調用的鉤子
__sleep
當使用serialize()函數對一個類進行序列話操作的時候,會調用這個鉤子
__wakeup
當使用unserialize()函數對一個類進行反序列話操作的時候,會調用這個鉤子
__toString
當一個對象將被轉變為字串的時候,會調用這個鉤子(比如echo的時候)
__set_state
當調用var_export()函數操作一個類的時候,會調用這個鉤子
__clone
當使用clone關鍵字對一個類進行拷貝操作的時候,會調用這個鉤子
__get
在擷取一個類中的屬性值的時候,會調用這個鉤子
__set
在設定一個類中的屬性值的時候,會調用這個鉤子
__isset
在使用isset()函數對類中的屬性值進行判定的時候,會調用這個鉤子
__unset
在使用unset()函數銷毀一個屬性值的時候,會調用這個鉤子
類的小技巧:
在執行個體話一個類的時候,可以使用這樣的形式給__construct鉤子傳遞參數:
PHP代碼
代碼如下:
<?php class TEST { public function __construct($para) { echo $para; } } $test = new TEST('value'); // 顯示 value ?>
foreach()函數可以用來對類或者對象中的屬性進行遍曆,遍曆的時候會先判斷public, protected, private的情況而顯示:
PHP代碼
代碼如下:
<?php class TEST { public $property1 = 'value1'; public $property2 = 'value2'; public $property3 = 'value3'; public function name() { foreach($this as $key => $value) { print "$key => $value\n"; } } } $test = new TEST; foreach($test as $key => $value) { print "$key => $value\n"; } $test->name(); ?>
在給類中的方法傳遞參數的時候,可以對參數進行強制的判定,這裡只支援對數組和對象的判定:
PHP代碼
代碼如下:
<?php class TEST1 { public function name( TEST2 $para ) { } } class TEST2 { } $test2 = new TEST2; $test1 = new TEST1; $test1->name('value'); // 會報錯,因為這個參數必須是TEST2執行個體化以後的對象 $test1->name($test1); // 不會報錯 ?>
相容php4的文法:
php5的類是往下相容php4的,這些php4時代的文法也得到了繼承,但是並不建議在php5的環境中使用。
(1)使用var預設屬性,會自動轉換成public。
(2)使用類名作為建構函式,在沒有__construct構造方法的情況下,會尋找和類名相同的函數作為建構函式。