OOP很多觀念要理解,所以會分很多天來看
在昨天有做建立物件的練習,接下來要在類別裡面加上方法,讓手機這個物件做事情
<?php
class phone{
public $model;
public $price;
public function call() //定義方法 使用public讓外面可以使用
{
echo "Calling...";
}
}
$apple = new phone();
$apple->call(); // 讓蘋果手機使用方法
?>
/*輸出
Calling...
*/
每次建立新手機都要重新設定屬性很麻煩,所以出現了建構子__construct
,他可以自動設定屬性,且讓程式碼更簡潔,以下是它的用法
<?php
class phone {
public $model;
public $price;
public function __construct($model, $price) {
$this->model = $model; // 把接收到的 $model 參數設定給 $this->model
$this->price = $price; // 把接收到的 $price 參數設定給 $this->price
}
public function showInfo() {
echo "型號:" . $this->model . "<br>";
echo "價格:" . $this->price . "<br>";
}
}
// 建立物件時傳入參數
$apple = new phone("iPhone 15", 10000);
$apple->showInfo();
/*輸出
型號:iPhone 15
價格:10000
*/
?>
說明:
建構子的目的就是把接收到的參數設定給物件的屬性$this->
指向當前物件,用來存取物件的屬性或方法,這是固定用法
接下來要學繼承(extends)
繼承可以讓程式碼不用再寫重複的功能,繼承分為父類別和子類別,子類別去繼承父類別寫好的程式碼,也可以繼續寫新功能。
想像:
父類別 = 一般手機(有基本功能)
子類別 = 智慧手機(繼承基本功能 + 新增智慧功能)
<?php
// 父類別
class phone {
public $model;
public $price;
public function __construct($model, $price) {
$this->model = $model;
$this->price = $price;
}
public function call($number) {
echo $this->model . " 撥號給 " . $number;
}
}
// 子類別
class SmartPhone extends phone {
}
$smartPhone = new SmartPhone("iPhone 15", 30000);
$smartPhone->call("0912345678"); // 繼承的功能
/*iPhone 15 撥號給 0912345678*/
?>
在這段code可以看到SmartPhone去繼承了phone所以phone是父類別SmartPhone是phone的子類別,子類別可以使用父類別定義的函式以及建構子,若不想使用父類別的建構子也可以自己定義,預設是繼承父類別的來用
如果子類別想自己建立建構子(新增屬性)同時繼承父類別的建構子的話就要使用parent::__construct()
這是繼承中最常見的實務用法,因為常常需要在子類別中新增功能。
<?php
class phone {
public $model;
public $price;
public function __construct($model, $price) {
$this->model = $model;
$this->price = $price;
}
}
class SmartPhone extends phone {
public $os;
// 子類別自己的建構子
public function __construct($model, $price, $os) {
parent::__construct($model, $price); // 呼叫父類別建構子
$this->os = $os; // 新增屬性
}
public function showInfo() {
echo "型號:" . $this->model . "<br>";
echo "價格:" . $this->price . "<br>";
echo "作業系統:" . $this->os . "<br>";
}
}
$smartPhone = new SmartPhone("iPhone 15", 30000, "iOS 18");
$smartPhone->showInfo();
/*型號:iPhone 15
價格:30000
作業系統:iOS 18*/
?>
說明:
parent::__construct() 可以重用父類別的初始化邏輯。
這樣避免重複寫 $this->model、$this->price。
在開發中:
父類別:放共用功能(例如「打電話」)。
子類別:新增各自的功能(例如 iPhone 可用 FaceTime,Android 可用 Google Meet)。
這樣寫可以讓程式:
更容易擴充
更好維護
更符合真實世界的關係(例如「智慧手機」就是一種「手機」)