1. 程式人生 > >繼承和抽象類思想

繼承和抽象類思想

得到 參數 指定 function nds struct 不一致 ray 訪問修飾符

訪問修飾符

  public:公共的,共有的,公開的(可以在“任何位置”使用)

  protected:受保護的(可以在當前類或繼承關系中使用)

  private:私有的(只能在其所在的類中訪問)

父類關鍵詞

  parent代表父類

父類的使用

   parent::__construct($p1);//調用父類的構造函數來初始化p1

繼承關鍵字

  class 子類 extends 父類 {}

構造方法析構方法在繼承中的表現

  子類中沒有定義構造方法時,會自動調用父類的構造方法

  可以手動調用 parent::__construct($p1)

優點:節約代碼

重寫關鍵字:override

例子

class C{

function show1($para1){

echo "<br />父類的show1方法:para1 = " . $para1;

}

}

class D extends C{

function show1($para, $para2){//參數不一致

echo "<br />子類的show1方法";

}

}

重寫的基本要求

訪問權限

下級的訪問控制權限應該不低於上級的訪問控制權限:

方法的參數形式

應該跟父類的一致。

最終類關鍵字final class(最終方法:final method)

用途:不希望對其進行擴展

書寫形式:final class 類名{ }

工廠模式

class factory{

//Instance表示“實例”,“對象”

static function getInstance($className){

if(file_exists(‘./class/‘ . $className . ".class.php")){

$obj1 = new $className();

return $obj1;

}

else{

return null;//也可以die();

}

}

}

$obj1 = factory::getInstance("A");//獲取類A的一個對象

$obj2 = factory::getInstance("B");//獲取類B的一個對象

$obj3 = factory::getInstance("A");//再獲取類A的一個對象

優點:只需要指定對象就可以創建

單例模式設計

某個類,只允許其“創建”出一個對象,即使去進行多次創建,也只能得到一個對象。

單例模式的關鍵點

  1. 設置私有屬性
  2. 設置私有構造方法
  3. 設置執行方法
  4. 設置私有拷貝方法

抽象類

關鍵字:abstract

作用:用於做父類,規範類,不需要實例化

抽象類方法

抽象方法是一個沒有方法體(也不含大括號)的方法定義“頭”而已

即相當於要求下級類去完成該功能(動作),但自己是不做的

重載方法

在一個類中,有多個同名的方法,每個方法的參數不同而已。這種現象就稱為“重載”

參數不同可以是:數量個數不同,或類型不同,或順序不同

例子

class A{

int function f1(int x){......}

int function f1(int x, int y){.....}

int function f1(string s int m){....}

}

在PHP中重載只是一個概念

屬性重載

所謂屬性重載,就是在面對上述4種情形的屬性使用場景中,該對象如果來“應對”的問題。

如果某屬性不存在,但在語法中使用如下情形,則會發生:

取值:$v1 = 對象->屬性; ===>自動調用類中的__get()方法

賦值:對象->屬性 = XX值; ===>自動調用類中的__set()方法

判斷是否存在:isset(對象->屬性;) ===>自動調用類中的__isset()方法

銷毀:unset(對象->屬性;) ===>自動調用類中的__unset()方法

方法重載

關鍵字:__call

例子:

Function f1(){

Echo :”f1被調用”

}

Function f2($x,$y){

Echo :”f2被調用”;

Return $x+$y;

}

Class a{

Public $p1=1;

Function __call($x,$arr){

$c=count($array);

If($c==0){

F1();

}else if(){

Return f2($arr[0],$arr[1]);

}

}

}

$d=new a();

$d->f1();

$v1=$d->f1(1,2)//f1不存在兩個參數

echo "<br />d1裏面的p1=" . $d1->p1;

echo "<br />結果v1=" . $v1;

執行結果
f1被調用
f1被調用

o1裏面的p1=1
結果v1=3

繼承和抽象類思想