面向對象三大特征
很多資料說面向對象有三條特征是封裝,繼承多态。
但是抽象也是面向對象中的一個特征。
抽象
去定義一個類時候,實際上就是把一類事物的共有的屬性和行為提取出來,形成一個實體模型(模闆)。這種研究問題的方法稱為抽象。
封裝
封裝就是把抽象出的資料和對資料的操作封裝在一起,資料被保護在内部,程式的其它部分隻有通過被授權的操作(成員方法),才能對資料進行操作。
繼承
繼承可以解決代碼複用,當多個類存在相同的屬性(變量)和方法時,可以從這些類中抽象出父類,在父類中定義這些相同的屬性和方法,所有的子類不需要重新定義這些屬性和方法,隻需要通過
class 子類名 extends 父類名{
}
這樣,子類就會自動擁有父類定義的屬性和方法。
多态
函數名一樣,通過函數的參數個數或者是參數類型不同,達到調用同一個函數名,但是可以區分不同的函數。
傳統的重載
class A{
public function test1(){
echo “test1”;
}
public function test1($a){
echo “test1 hello”;
}
}
$a =new A();
**沒有傳入參數則調用test1(){}
$a->test1();
**傳入參數則調用test1($a){}
$a->test1(456);
上面這種寫法在php中會報錯。PHP是弱類型語言,是以PHP不支援多态。但是PHP有自己的重載方法來模拟多态。
PHP中的“重載”與其它絕大多數面向對象語言不同。傳統的“重載”是用于提供多個同名的類方法,但各方法的參數類型和個數不同。
使用魔術方法__call
__call 是它一個對象調用某個方法,而該方法不存在,則系統會自動調用__call
<?php
class A{
public function test1($p){
echo "接收一個參數<br/>";
}
public function test2($p){
echo "接收兩個參數<br/>";
}
//這些提供一個__call
//__call 是它一個對象調用某個方法,而該方法不存在,則
//系統會自動調用__call
function __call($method,$p){
var_dump($p);
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1); //結果:接收一個參數
$a->test(56,90);//結果:接收二個參數
?>
關于屬性的重載php也有自身的方法來實作。
php重載