構造、析構;重寫;設計模式;單例;抽象;重載

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

若是子類中沒有構造方法的時候,自動調用父類的構造方法,實例化子類的時候,須要根據父類的構造方法來寫php

代碼演示:mysql

子類若是有構造方法,則不能調用父類的構造方法,若是要調用能夠選則如下形式:sql

parent::__construct();注意:兩個下劃線數據庫

 

一般爲了節省代碼,或者增長可讀性,通常都是調用父類的構造方法設計模式

重寫override

重寫是用在繼承裏面的,調用父類方法時,子類的方法名和參數名相同。ide

class jizhuianimal{

public $li1 = "有脊椎動物";

function show1(){

echo "<br />特徵:".$this->lei1;

}

 

}

class human extends jizhuianimal{

public $li1 ="具備28節脊椎";

public $li2 ="有32顆牙齒";

 

function show2(){

echo "<br/>我是人類,特徵有:".$this->li1;

parent::show1();

echo "<br />".$this->li2;

}

}

 

$hum1=new human();

$hum1->show2();
代碼練習

 

注意:若是父類的方法不適合子類,則須要子類徹底由本身寫ui

重寫的基本要求:

訪問控制權限:this

不能躍級訪問spa

上級:public 下級一樣是public設計

上級:protected 下級能夠是protectedpublic

上級:private 下級均可以(私有的不能覆蓋,是全新的建立)

最終類final class

若是一種類不想再擴展了,那麼就能夠用最終類來表示

表達形式:

final  class  類名{ 。。。。類定義。。。。}

最終方法final method

若是一個方法不想被下級覆蓋,那麼能夠將這類方法寫爲最終方法

表達形式:

final  function  方法名(){。。。。方法定義。。。。}

設計模式

設定一些經常使用的解決方法,來減小工做量和代碼量

工廠模式:

至關於現實生活中的加工廠,這個加工廠能夠加工出想要的對象,只要指定一個類名,就能夠獲取該類的對象

代碼演示:

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、私有構造方法(不能new

3、提供獲取對象的方法(這裏面判斷是否存在)

4、私有克隆

 

代碼演練:

//實現一個單例類:其只能得到一個對象

class B{

public $v1 = 10;

 

private static $instance;

 

private function __construct(){}

public static function getNew(){

//若是本類中的$instance尚未數據

if( !isset(B::$instance) ){

B::$instance = new self;

}

return B::$instance;

}

private function __clone(){}

}

//$o1 = new B();//出錯,由於構造方法私有了,

$o1 = B::getNew();

$o1->v1 = 100; //修改

$o2 = B::getNew();

var_dump($o1);

echo "<br />";

var_dump($o2);

$o3 = clone $o1; //克隆對象

echo "<br />";

var_dump($o3);

$o1->v1 = 123;

echo "<br />o1中的v1爲:" . $o1->v1;

echo "<br />o2中的v1爲:" . $o2->v1;

echo "<br />o3中的v1爲:" . $o3->v1;
代碼演練

$link = mysql_connect(「localhost」, 「root」, 「123」); //獲得一個「鏈接到mysql數據庫」的資源。

$result = mysql_query(select .....」); //這個是結果集資源

 

抽象類,抽象方法

抽象類:

關鍵字:abstract

表達形式:abstract  class  類名{.....類的定義.....} 

抽象類又是「父類」,子類繼承它的特性就是規範(不可實例化,也就是沒有對象)

抽象方法:

抽象方法是一個簡單的描述,沒有大括號,也沒有方法體

例如:abstract  function  f1($x1, $y, $m)

抽象方法裏只能寫抽象類,要求下級類去完成工做

子類要繼承父類的全部抽象方法,除非子類也是抽象類

PHP中的重載技術

同名不一樣參的方法(類型,數量)稱爲重載

例如:

class  A{

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

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

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

}

屬性重載:若是使用不存在的屬性,則會自動調用父類預約義好的方法來處理。

適用的情形對應相應的解決方法:

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

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

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

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

方法重載:若是使用不存在的方法,則會自動調用父類預約義好的__call方法(必須帶兩個參數)來處理此行爲。

「魔術方法」:

__get(), __set(),  __isset(), __unset(),  __call(),  __callstatic();

相關文章
相關標籤/搜索