跟PHP一起玩轉物件導向:從玩具箱到工具箱-實戰應用

閱讀時間約 12 分鐘

第四階段:實戰應用

在這個階段,我們將透過一些實戰案例和設計模式的介紹,來加深對物件導向概念的應用理解。透過實作,我們可以將理論與實際結合,進一步提升自己的程式設計能力。



實戰題目:人力資源管理功能

基本需求

在這個題目中,我們將設計一個人力資源管理系統,透過繼承來展示物件導向設計的優勢。系統中將包含兩個主要的類別:Person 和繼承自 PersonEmployee

  • Person 類別:這個類別是基礎類別,包含基本的個人資料。
    • 屬性:姓名(name)、年齡(age)、性別(gender)
    • 方法:介紹自己(introduce),輸出個人基本資訊。
  • Employee 類別:這個類別繼承自 Person,代表公司的員工。
    • 屬性:職位(position)、年薪(annualSalary)
    • 方法:顯示工作資訊(displayWorkInfo),包括職位和年薪。

進階要求

  • 多態性:添加一個可以處理多種類型員工的功能,例如 Manager 類別和 Intern 類別,它們都繼承自 Employee 但具有特定的行為或屬性。
    • Manager:除了基本員工資訊,還應該有下屬員工列表(subordinates)。
    • Intern:有實習期限(internshipDuration)和指導員工(mentor)。
  • 介面實現:定義一個 Workable 介面,包含 work() 方法。不同的員工類別將實現這個方法來描述他們的工作內容。


在實際看到程式碼之前,先自己動手練習試試看吧~

raw-image



在這UML圖中,可以很明確的知道,類別跟介面之間的關係,這樣有沒有讓你更清楚要設計的脈絡呢~

raw-image



上Code!!!

人員基本類別

<?php

namespace Rewrite\\ExerciseObjectOriented\\Practical;

/**
* 表示某個人
*
* Class Person
*
* @package Rewrite\\ExerciseObjectOriented\\Practical
*
* @property string $name
* @property int $age
* @property string $gender
*/
class Person
{
/** @var string 姓名 */
protected string $name;

/** @var int 年齡 */
protected int $age;

/** @var string 性別 */
protected string $gender;

public function __construct(string $name, int $age, string $gender = '')
{
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
}

/**
* 自我介紹
*
* @return string
*/
public function introduce()
{
return "我的名字是{$this->name},今年{$this->age}歲,性別{$this->gender}。";
}
}

員工類別

<?php

namespace Rewrite\\ExerciseObjectOriented\\Practical;

/**
* 員工,繼承「人」、賦予了行為
*
* Class Employee
* @package Rewrite\\ExerciseObjectOriented\\Practical
*/
class Employee extends Person
{
protected string $position;
protected int $annualSalary;

/**
* @param string $name
* @param int $age
* @param string $gender
* @param string $position
* @param int $annualSalary
*/
public function __construct(string $name, int $age, string $gender, string $position, int $annualSalary)
{

parent::__construct($name, $age, $gender);

$this->position = $position;
$this->annualSalary = $annualSalary;
}

/**
* @return string
*/
public function displayWorkInfo(): string
{
return "{$this->introduce()} 我的職位是{$this->position},年薪為{$this->annualSalary}。";
}
}

定義工作-介面

<?php

namespace Rewrite\\ExerciseObjectOriented\\Practical;

/**
* Workable 介面
*
* Interface Workable
* @package Rewrite\\ExerciseObjectOriented\\Practical
*/
interface Workable
{
/**
* 工作
*
* @return string
*/
public function work(): string;
}

管理者類別

<?php

namespace Rewrite\\ExerciseObjectOriented\\Practical;

/**
* 管理者
* Manager 繼承 Employee 並實作 Workable
*
* Class Manager
* @package Rewrite\\ExerciseObjectOriented\\Practical
*/
class Manager extends Employee implements Workable
{
/** @var array */
private array $subordinates = [];

/**
* 這裡的參數可以使用物件作為傳遞的內容
* 這樣就可以直接將員工的物件加入到管理者的屬性中,並且取用對應的方法
*
* @param Employee $employee
* @return void
*/
public function addSubordinate(Employee $employee): void
{
$this->subordinates[] = $employee;
}

/**
* 列出所有團隊成員的基本資訊
*
* @return void
*/
public function listSubordinates(): void
{
echo "{$this->name} 的成員有:\\n";
foreach ($this->subordinates as $subordinate) {
echo "\\t" . $subordinate->introduce() . "\\n";
}
}

/**
* @inheritDoc
*/
public function work(): string
{
return "管理團隊和協調項目。";
}
}

addSubordinate的方法可以傳遞 Employee的物件,這樣就可以直接將員工的物件加入到管理者的屬性中,並且取用對應的方法,這也是一種封裝的概念

實習生類別

<?php

namespace Rewrite\\ExerciseObjectOriented\\Practical;

use Rewrite\\ExerciseObjectOriented\\Practical\\Employee;
use Rewrite\\ExerciseObjectOriented\\Practical\\Workable;

class Intern extends Employee implements Workable
{
/** @var int */
private int $internshipDuration;

/** @var string */
private string $mentor;

public function __construct($name, $age, $gender, $position, $annualSalary, $internshipDuration, $mentor)
{

parent::__construct($name, $age, $gender, $position, $annualSalary);

$this->internshipDuration = $internshipDuration;
$this->mentor = $mentor;
}

/**
* @inheritDoc
*/
public function work(): string
{
return "執行指派的任務和學習。";
}
}


使用端


use Rewrite\\ExerciseObjectOriented\\Practical\\Employee;
use Rewrite\\ExerciseObjectOriented\\Practical\\Manager;

// 使用範例
$manager = new Manager("陳大文", 45, "男", "部門經理", 1200000);
$employee1 = new Employee("王小明", 30, "男", "工程師", 800000);
$employee2 = new Employee("李小華", 28, "女", "設計師", 750000);

// 添加成員
$manager->addSubordinate($employee1);
$manager->addSubordinate($employee2);

// 顯示工作資訊和下屬列表
echo $manager->displayWorkInfo() . "\\n";
$manager->listSubordinates();

// 顯示工作內容
echo $manager->work() . "\\n";

輸出內容

raw-image



這個題目不僅檢驗基本的物件導向設計能力,還需理解和應用多態性和介面,這對於初學者與有經驗的學習者都是一個很好的挑戰。

後記

有沒有發現實習生的類別沒有被使用到,另外再想想看,實習生的類別有沒有需要改良的地方呢~?

<= To Be Continued…

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,作者都用幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
發表第一個留言支持創作者!
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
從基本的OOP概念、PHP基礎回顧,到類別與物件的深入探討、進階概念如繼承、介面與抽象類別,再到實戰應用與設計模式入門,最後以課程總結與未來學習資源提供作結。此課程架構確保學生能夠從基礎到進階,全面掌握PHP物件導向程式設計的核心概念與技術。
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
從基本的OOP概念、PHP基礎回顧,到類別與物件的深入探討、進階概念如繼承、介面與抽象類別,再到實戰應用與設計模式入門,最後以課程總結與未來學習資源提供作結。此課程架構確保學生能夠從基礎到進階,全面掌握PHP物件導向程式設計的核心概念與技術。
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在上一篇,我們寫好了低強度階段,這也代表音樂本身的架構已經完成一大半了,畢竟要用的和聲、音色的堆疊、曲子的氛圍,都是以低強度的曲子為基礎,再發展出其他部分。 不過,在開始之前,我們先來聊聊電玩音樂要怎麼在不同的情緒之間轉換,你就會更了解中強度和高強度音樂該怎麼寫囉。
Thumbnail
在電玩中,每個玩家的行為都不同,有人可能會在探索整個地圖時探索到迷路、有人可能打怪打特別久、有人可能玩到一半跑去上廁所。 所以在每個不同的電玩情境下,就變成你的音樂都不知道該播放多久才會切換到下一個情境中,甚至可能戰鬥完了,又要回到原本的氛圍音樂,這整個音樂播放的過程不是線性的從頭到尾,而是隨著情
Thumbnail
可能包含敏感內容
那天閨蜜來家裡一起練舞 跳舞跳完 進到房間裡一起玩了起來 跟閨蜜玩一玩 被老公發現了 而他也忍不住的加入了我們
Thumbnail
這是8月3日傍晚日本每日新聞的報導。 當時日本氣象預報表示6號卡努颱風將會來個回馬槍U型迴轉,其主要原因在於太平洋高氣壓與偏西風。
Thumbnail
先簡單說結論: 一個等號是賦值;二個等號是等於;三個等號是相同。
Thumbnail
「謝謝大家的歡迎,很高興有機會加入大家行列,希望藉由這個聚會讓我更認識神」MJ開始學習用基督徒的話說話,雖然覺得很怪,但他認為這麼做才能幫助自己快速融入大家。方才加入信仰小組的MJ,在不知情的狀況下跟著師母讀起「決志禱告文」,讀完後他的大腦思緒混亂到近乎空白了。
Thumbnail
當推特開始推展認證系統後,其他沒有認證的平台是不是就好像沒有那麼潮了? 要知道幣圈已經今非昔比在消費群眾裡面已經不容忽視,科技公司巨頭當然也知道加密領域是門好生意,跟風不是會不會發生,而是多快發生而已。
Thumbnail
「每一個人都應該要學習被領導與領導別人。」每一個人,都可能在生命的某個時刻,學習著要領導其他人,儘管我現在只是一個普通媽媽,卻也是個領導人,母親這個天職,讓我必須承擔起帶領兩個孩子的責任。 所以當我在看到雅典娜在面對走或不走的決定時,我不禁設想,如果我是她,該怎麼決定?
Thumbnail
20初頭就在海外流浪, 朋友以為我賺很多才可以老是換地方, 但他們不知道的是 - 小資族的玩法也可以很繽紛多漾. 今天跟大家分享除了代購, 廉價機票, 以及青年旅社外, 妳還有什麼方式可以花小錢「趴趴走」...
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在上一篇,我們寫好了低強度階段,這也代表音樂本身的架構已經完成一大半了,畢竟要用的和聲、音色的堆疊、曲子的氛圍,都是以低強度的曲子為基礎,再發展出其他部分。 不過,在開始之前,我們先來聊聊電玩音樂要怎麼在不同的情緒之間轉換,你就會更了解中強度和高強度音樂該怎麼寫囉。
Thumbnail
在電玩中,每個玩家的行為都不同,有人可能會在探索整個地圖時探索到迷路、有人可能打怪打特別久、有人可能玩到一半跑去上廁所。 所以在每個不同的電玩情境下,就變成你的音樂都不知道該播放多久才會切換到下一個情境中,甚至可能戰鬥完了,又要回到原本的氛圍音樂,這整個音樂播放的過程不是線性的從頭到尾,而是隨著情
Thumbnail
可能包含敏感內容
那天閨蜜來家裡一起練舞 跳舞跳完 進到房間裡一起玩了起來 跟閨蜜玩一玩 被老公發現了 而他也忍不住的加入了我們
Thumbnail
這是8月3日傍晚日本每日新聞的報導。 當時日本氣象預報表示6號卡努颱風將會來個回馬槍U型迴轉,其主要原因在於太平洋高氣壓與偏西風。
Thumbnail
先簡單說結論: 一個等號是賦值;二個等號是等於;三個等號是相同。
Thumbnail
「謝謝大家的歡迎,很高興有機會加入大家行列,希望藉由這個聚會讓我更認識神」MJ開始學習用基督徒的話說話,雖然覺得很怪,但他認為這麼做才能幫助自己快速融入大家。方才加入信仰小組的MJ,在不知情的狀況下跟著師母讀起「決志禱告文」,讀完後他的大腦思緒混亂到近乎空白了。
Thumbnail
當推特開始推展認證系統後,其他沒有認證的平台是不是就好像沒有那麼潮了? 要知道幣圈已經今非昔比在消費群眾裡面已經不容忽視,科技公司巨頭當然也知道加密領域是門好生意,跟風不是會不會發生,而是多快發生而已。
Thumbnail
「每一個人都應該要學習被領導與領導別人。」每一個人,都可能在生命的某個時刻,學習著要領導其他人,儘管我現在只是一個普通媽媽,卻也是個領導人,母親這個天職,讓我必須承擔起帶領兩個孩子的責任。 所以當我在看到雅典娜在面對走或不走的決定時,我不禁設想,如果我是她,該怎麼決定?
Thumbnail
20初頭就在海外流浪, 朋友以為我賺很多才可以老是換地方, 但他們不知道的是 - 小資族的玩法也可以很繽紛多漾. 今天跟大家分享除了代購, 廉價機票, 以及青年旅社外, 妳還有什麼方式可以花小錢「趴趴走」...