繼承和抽象類思想
訪問修飾符
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的一個對象
優點:只需要指定對象就可以創建
單例模式設計
某個類,只允許其“創建”出一個對象,即使去進行多次創建,也只能得到一個對象。
單例模式的關鍵點
- 設置私有屬性
- 設置私有構造方法
- 設置執行方法
- 設置私有拷貝方法
抽象類
關鍵字: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
繼承和抽象類思想