iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Modern Web

PHP 新手自學筆記系列 第 22

【Day22】物件導向 (OOP)

  • 分享至 

  • xImage
  •  

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)。

這樣寫可以讓程式:
更容易擴充
更好維護
更符合真實世界的關係(例如「智慧手機」就是一種「手機」)


上一篇
【Day21】物件導向 (OOP) 基礎知識
下一篇
【Day23】 PHP 封裝
系列文
PHP 新手自學筆記24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言