1. 程式人生 > >四、資源和物件的區別、抽象類和抽象方法、過載技術、介面interface

四、資源和物件的區別、抽象類和抽象方法、過載技術、介面interface

一、資源和物件的辨析
熟悉的資源:
      $link = mysql_connect(“localhost”, “root”, “123”); //得到一個“連線到mysql資料庫”的資源。
      $result = mysql_query(“select .....”);//這個是結果集資源

資源就是一個外部本來就有的“物件”(資料),在程式中,資源變數只是一個“指向”該物件(資料)的標示符,而物件是我們通過程式碼創建出來的。

二、抽象類,抽象方法
抽象類:

在正常定義類的前面,加上關鍵字:abstract,那就構成抽象類。
abstract  class  類名{.....類的定義.....}
(1)、抽象類:


抽象類可以用來規範一些類的共同特性,但又不需要去對其進行例項化。
怎麼規範:繼承它。
也就是說,抽象類的使命是專門做“父類”:子類就繼承了它的特性,這就是“規範作用”
(2)、抽象方法:
抽象方法是一個沒有方法體(也不含大括號)的方法定義“頭”而已。
前面需要加上abstract。
比如:abstract  function  f1($x1, $y, $m) ; //注意,後面一定有分號。
抽象方法的作用:
其實跟抽象類一樣,配合抽象類,來實現對下級類的“行為規範”。
即相當於要求下級類去完成該功能(動作),但自己是不做的。

注意:抽象類抽象方法細節關係描述
1,如果一個方法定義為抽象方法,則其所在的類必須定義為抽象類。
2,但,一個抽象類中,可以沒有抽象方法——但通常意義不大。
3,子類繼承自一個抽象類,則子類必須實現父類中的所有抽象方法,除非子類也繼續作為抽象類
4,子類實現抽象父類的方法時,訪問控制修飾符的範圍不能降低,且方法的引數也須一致——其實這就是重寫,所以要滿足重寫的要求。

三、過載技術
語法:在一個類中,有多個同名的方法,每個方法的引數不同而已。這種現象就稱為“過載”。
引數不同可以是:數量個數不同,或型別不同,或順序不同。
比如:
class  A{
int  function  f1(int  x){......}
int  function  f1(int  x,  int  y){.....}
int  function  f1(string s   int  m){....}
}
但,在php中,一個類中,根本就不可以定義多個同名方法——這直接是語法錯誤。
實際上,php中的過載,是另一個“概念”,其指的是:
屬性過載:如果使用一個不存在的屬性,就會去自動呼叫類中預先定義好的某個方法以處理資料;
方法過載:如果使用一個不存在的方法,就會去自動呼叫類中預先定義好的某個方法以處理該行為
1、屬性過載


屬性有哪些使用情形?其實跟變數一樣,只有4種使用情形:
取值:$v1 = 物件->屬性;
賦值:物件->屬性 = XX值;
判斷是否存在:isset(物件->屬性;)
銷燬:unset(物件->屬性;)
所謂屬性過載,就是在面對上述4種情形的屬性使用場景中,該物件如果來“應對”的問題。
如果某屬性不存在,但在語法中使用如下情形,則會發生:
取值:$v1 = 物件->屬性;   ===>自動呼叫類中的__get()方法
賦值:物件->屬性 = XX值;  ===>自動呼叫類中的__set()方法
判斷是否存在:isset(物件->屬性;) ===>自動呼叫類中的__isset()方法
銷燬:unset(物件->屬性;)   ===>自動呼叫類中的__unset()方法
前提都是:類中要預先定義好這些方法。
2、方法過載
當使用一個物件呼叫一個不存在的普通方法的時候,會自動去呼叫預先定義好的"__call"方法。
其中,該方法必須帶2個引數
當使用一個物件(類)呼叫一個不存在的靜態方法的時候,會自動去呼叫預先定義好的"__callStatic"方法。
其中,該方法必須帶2個引數。其實跟前面一樣!

四、介面interface
類:有屬性,有方法;有類常量;
抽象類:有屬性,有方法;有類常量; 還可以有抽象方法(只有方法頭)
“更”抽象類(就是介面) :有介面常量;還可以有抽象方法(只有方法頭)

可見,介面中,只有兩類最簡單特性資訊:
介面常量:其實就是常量。
抽象方法:只有方法頭——下級自然就應該去“實現”它。

介面的作用:
1)、介面可以看作是抽象類的更高層面的“抽象規範”,不考慮介面常量的話,那麼就相當於之規定了“下級類”要做什麼——至於怎麼就,沒有規定。
2)、介面也可以說,在一個抽象類中只有類常量和抽象方法的一種特例情形。
3)、介面可以實現“多繼承”(多實現),而類不行。
注意:
1、一個類只能繼承一個父類,但可以實現多個“上級介面”,語法形式:
class  類A  extends  類B  implements  介面1,介面2,.... { 。。。類定義語句。。。}
2、一個介面同樣可以繼承另一個介面(也是單繼承):
interface  介面1  extends 介面2  {介面定義}