標籤:變數 操作 間接 重要 多態 調用 私人化 copy new
首先,在解釋物件導向之前先解釋下什麼是物件導向?
[物件導向]
1、什麼是類?
具有相同屬性(特徵)和方法(行為)的一系列個體的集合,類是一個抽象的概念
2、什麼是對象?
從類中拿到的具有具體屬性值得個體,稱為對象,對象是一個具體的個體
所以,物件導向即我們專註對象來處理問題,通過從一個個具有屬性和功能的類中拿到對象來處理問題。
下面我們再來細說下物件導向的三大特徵:繼承/封裝/多態
一、繼承
在PHP中我們主要通關Extends關鍵字來實現繼承 ->class Student extends Person{}
下面是幾個比較重要的注意事項:
①子類只能繼承父類的非私人屬性。
②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性;
③PHP只能單繼承,不支援一個類繼承多個類。但是一個類可以進行多層繼承(即A繼承於B,而C又繼承於A,C通過A間接繼承了B)
二、封裝
類實現封裝是為了不讓外面的類隨意的修改一個類的成員變數,所以在定義一個類的成員的時候,我們使用private關鍵字設定這個成員的存取權限
只能被這個類的其他成員方法調用,而不能被其他類中的方法調用,即通過本類中提供的方法來訪問本類中的私人屬性。
①所以在該類中我們會提供一個訪問私人屬性的方法
②然後我們一般會定義兩個方法來實現對一個變數的操作,即:get()與set()方法。
程式碼範例如下:
class Person{ private $name; private $age; public function __construct($name,$age){ $this->name = $name; $this->age = $age; } function setAge($age){ if($age>=0&&$age<=120){ $this->age = $age; }else{ error_log("年齡設定有誤!"); } } function getAge(){ return $this->age; } public function say(){ echo "我叫{$this->name},我今年{$this->age}歲了"; } function __get($name){ switch ($name) { case ‘name‘: return $this ->$name."這是讀取時加的文字"; case ‘age‘: return "0".$this ->$name; default: return $this ->$name; } } function __set($key,$value){ if($key=="name"){ $this->$key = $value."這是設定時加的文字<br>"; }else{ $this->$key = $value; } } function __isset($name){ return isset($this->$name); } function __unset($name){ if($name=="age"){ return; } unset($this->$name); } } $zhangsan = new Person("zhangsan",14);$zhangsan->setAge(12);echo $zhangsan->getAge()."<br>";var_dump(isset($zhangsan->name));unset($zhangsan->age);echo $zhangsan->age;
三、多態
什麼是多態?
一個類,被多個子類繼承,如果這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態。(同一個類的不同子類表現出不同的形態)
那麼我們如何來實現多態呢?
子類繼承父類 ->子類重寫父類方法 ->父類引用指向子類對象
abstract class Person{ 註:父類使用abstract關鍵字修飾
abstract function say();
}
class Chinese extends Person{ 註:子類重寫父類方法
function say(){
echo "我是中國人<br>";
}
}
class English extends Person{ 註:子類重寫父類方法
function say(){
echo "我是英國人";
}
}
$zhangsan = new Chinese();
$zhangsan->say();
$z = new English();
$z->say();
Person $p = new Chinese(); 註:父類引用指向子類對象
上述代碼中,兩個子類都是繼承自同一父類,但因為都重寫了父類的方法,表現出了不同的形態
* 四、單例設計模式
單例模式也叫單態模式
可以保證一個類只能有一個對象執行個體
實現要點:
①建構函式私人化,不允許使用new關鍵字建立對象。
②對外提供擷取對象的方法,在方法中判斷對象是否為空白,如果為空白則建立對象並返回,如果不為空白則直接返回
③執行個體對象的屬性以及擷取對象的方法必須都是靜態。
④之後,建立對象只能使用我們提供的靜態方法。
範例程式碼如下:
class Singleton{static public $Single = null;private function __construct(){}static function getSingle(){if(!self::$Single){self::$Single = new Singleton();//self代指類名 new Singleton()和newself()是完全一樣的}return self::$Single;}function __destruct(){echo "我被銷毀了<br>";}} $s1 = Singleton::getSingle();$s1 = Singleton::getSingle();$s1 = Singleton::getSingle();
PHP物件導向詳解:繼承、封裝與多態