若是子類中沒有構造方法的時候,自動調用父類的構造方法,實例化子類的時候,須要根據父類的構造方法來寫php
代碼演示:mysql
子類若是有構造方法,則不能調用父類的構造方法,若是要調用能夠選則如下形式:sql
parent::__construct();注意:兩個下劃線數據庫
一般爲了節省代碼,或者增長可讀性,通常都是調用父類的構造方法設計模式
重寫是用在繼承裏面的,調用父類方法時,子類的方法名和參數名相同。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 下級能夠是protected,public
上級:private 下級均可以(私有的不能覆蓋,是全新的建立)
若是一種類不想再擴展了,那麼就能夠用最終類來表示
表達形式:
final class 類名{ 。。。。類定義。。。。}
若是一個方法不想被下級覆蓋,那麼能夠將這類方法寫爲最終方法
表達形式:
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) ;
抽象方法裏只能寫抽象類,要求下級類去完成工做
子類要繼承父類的全部抽象方法,除非子類也是抽象類
同名不一樣參的方法(類型,數量)稱爲重載
例如:
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();