php類和對象(二)

類常量:類常量能夠當作是一個有前綴的常量,類名是前綴,用的時候和類變量同樣 函數

構造函數:構造函數能夠這麼說是類實例最先運行的函數,構造函數能夠用__construct 或者類名 來定義,可是如今來講仍是用前者吧,後者到最後不知道會不會被淘汰; this

析構函數:析構函數是在實例被刪除的時候被調用的函數;不要在析構函數中拋出一個異常,不然會致使致命錯誤。 spa

咱們來看看下面的例子 .net

01 class Zhuge{
02   public $name;
03   function __construct($name){
04     $this->name = $name;
05     echo "我是構造函數,我屬於".$this->name."!qaforcode.net\n";
06   }
07   function __destruct(){
08  
09     echo "我是析構函數,我屬於".$this->name."!qaforcode.net\n";
10   }
11 }
12  
13 $a = new Zhuge("豬哥");
14 unset($a);//試試註釋掉這行看看效果
15 $b = new Zhuge("豬哥疼你");

抽象類:抽象類,就至關於比類更加高一層的東西。好比你的說動物,動物描述的是一個種類,而不是具體的某個動物。這個就能夠定義爲抽象類。抽象類不能直接被實例化,你必須先繼承該抽象類,而後再實例化子類。抽象類中 至少要包含一個抽象方法。若是類方法被聲明爲抽象的,那麼其中就不能包括具體的功能實現。繼承一個抽象類的時候,子類必須實現抽象類中的全部抽象方法;若是抽象類中某個抽象方法被聲明爲protected,那麼子類中實現的方法就應該聲明爲protected或者public,而不 能定義爲private。 code

01 abstract class Animal{
02  
03   abstract public function eat();
04 }
05  
06 class Cat{
07   public function eat(){
08     echo "I'm eating;";
09   }
10 }
11  
12 //$a =  new Animal();會出錯
13 $black_cat =  new Cat();
14  
15 $black_cat->eat();

接口:接口和抽象類有點類似,只是他是功能性的,抽象類有點父子的關係,接口類有點象功能集合。電燈有發光的功能,蠟燭也有。看下面的例子 對象

01 interface Light{
02  
03   public function turnoff();
04   public function turnon();
05 }
06  
07 class ElectricLight implements Light{
08  
09   public function turnoff(){
10     echo "turnoff by touch switch\n";
11   }
12   public function turnon(){
13     echo "turnon by touch switch\n";
14   }
15  
16 }
17 class Candle implements Light{
18  
19   public function turnoff(){
20     echo "turnoff by blow\n";
21   }
22   public function turnon(){
23     echo "turnon use match\n";
24   }
25  
26 }
27 $electriclight = new ElectricLight();
28 $candle = new Candle();
29 $electriclight->turnoff();
30 $candle->turnoff();

你能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容。 繼承

咱們能夠經過interface來定義一個接口,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。 接口

接口中定義的全部方法都必須是public,這是接口的特性。 字符串

要實現一個接口,可使用implements操做符。類中必須實現接口中定義的全部方法,不然 會報一個fatal錯誤。若是要實現多個接口,能夠用逗號來分隔多個接口的名稱。 get

魔術方法:PHP把全部以__(兩個下劃線)開頭的類方法當成魔術方法。因此你定義本身的類方法時,不要以 __爲前綴。

__sleep 和 __wakeup:serialize() 函數會檢查是否存在一個魔術方法 __sleep.若是存在,__sleep()方法會先被調用, 而後才執行序列化操做。與之相反,unserialize()會檢查是否存在一個__wakeup方法。若是存在,則會先調用 __wakeup方法,預先準備對象數據。

__toString:__toString 方法可讓一個類決定它如何轉換成一個字符串。

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

__set_state:當調用var_export()時,這個靜態 方法會被調用

final:若是父類中的方法被聲明爲final,則子類沒法覆蓋該方法; 若是一個類被聲明爲final,則不能被繼承。

對象比較:當使用對比操做符(==)比較兩個對象變量時,比較的原則是:若是兩個對象的屬性和屬性值 都相等,並且兩個對象是同一個類的實例,那麼這兩個對象變量相等。而若是使用全等操做符(===),這兩個對象變量必定要指向某個類的同一個實例(即同一個對象)。

01 class A{
02   public $name;
03  
04   function __construct($name){
05  
06     $this->name = $name;
07   }
08   function getName(){
09  
10     return $this->name;
11   }
12  
13 }
14 $a = new A("趴樹上的豬");
15 $b = new A("趴樹上的豬");
16 $c = $a;
17  
18 var_dump($a==$b);
19 var_dump($a===$b);
20 var_dump($a==$c);
21 var_dump($a===$c);

 

本文固定連接: http://www.qaforcode.net/archives/270 | 豬哥每日一貼

相關文章
相關標籤/搜索