首先介紹幾個概念:
1. 範圍解析操作符 (::)或者更簡單地說是一對冒號,可以用於訪問靜態成員,類常量,還可以用於覆蓋類中的屬性和方法。
2. 繼承:當擴展一個類,子類就會繼承父類所有公有的和受保護的方法。除非子類覆蓋了父類的方法,被繼承的方法都會保留其原有功能。
3. 多態的應用:父類對象的引用指向子類對象,其實本質上就是一個向上轉型。
例子:老闆(boss 對象)對員工說都回去工作(調用函數sayGotoDo函數),這是所有的員工(會計員、程序員、行政人員)都會響應該函數事件,去工作(執行子類的工作事件,doCaculate、doProgram、doWork...),但是每個工作事件都不一樣,這就是多態,父類的函數執行具體到子類執行時,是不盡相同的。
<?php
class Person
{
protected $name;//protected:受保護的,外部不可見,只允許內部和子類訪問
protected $age;
protected $salary;
public function __construct($name,$age,$salary){
$this->name = $name;
$this->age = $age;
$this->salary = $salary;
}
// public function getMsg(){
protected function getMsg(){ // 聲明爲protected,這樣就只能被子類繼承,子類繼承後還是protected
return '我的名字是:'.$this->name.',年齡是:'.$this->age.',薪資是:'.$this->salary;
}
}
// $person = new Person('Peter',33,4000);
// echo $person->getMsg().'<br>';
// 我的名字是:Peter,年齡是:33,薪資是:4000
// 聲明一個子類(擴展類),繼承使用關鍵字extends,php是單繼承語言
// 創建子類是爲了擴展父類的功能,實現代碼的複用
class Employee extends Person
{
protected $department;// 部門
public function __construct($name,$age,$salary,$department){
parent::__construct($name,$age,$salary);
// $this->name = $name;
// $this->age = $age;
// $this->salary = $salary;
$this->department = $department;
}
// 重寫getMsg方法,在子類中重寫父類方法,其訪問權限不能低於原來的,原來是protected,那麼現在應該是public
public function getMsg(){
// protected function getMsg(){ // 聲明爲protected,這樣就只能被子類繼承,子類繼承後還是protected
// return '我的名字是:'.$this->name.',年齡是:'.$this->age.',薪資是:'.$this->salary.',部門是:'.$this->department;
return parent::getMsg().',部門是:'.$this->department;
}
}
$person = new Employee('Charry',53,30000,'開發部');
echo $person->getMsg().'<br>';
// 我的名字是:Charry,年齡是:23,薪資是:30000,部門是:開發部
?>