更新於 2024/08/10閱讀時間約 7 分鐘

跟PHP一起玩轉物件導向:從玩具箱到工具箱-基礎介紹

這一階段將對物件導向程式設計(OOP)的核心概念進行初步介紹,為後續更進階的學習奠定基礎。


第一節:物件導向程式設計介紹

  • 物件導向程式設計的概念:介紹 OOP 是一種程式設計範式,它使用「物件」來設計應用程式和電腦程式。物件導向程式設計的目的是提高軟體的重用性、可擴展性和可維護性...。介紹的部分就不贅述囉

第二節:OOP 的基本概念

類別(Class)和物件(Object)

類別是設計圖,描述了一組有相同屬性(Attribute)和方法(Method)的物件應有的結構。想像類別就像是製造汽車的設計藍圖,而物件則是根據這個藍圖生產出來的實際汽車。每一輛汽車(物件)都可以有不同的顏色或馬力(屬性值),但它們都是根據同一個設計藍圖(類別)製造的。

屬性(Attributes)

屬性是類別中用來存放資料的變數,你可以想像它們是物件的特徵,比如一個人類別(Person Class)的物件可能會有名字(Name)、年齡(Age)等屬性。

方法(Methods)

方法定義了物件能夠執行的操作,比如一個汽車物件可能有啟動(Start)和停止(Stop)的方法。方法在類別中定義,並且由物件來調用。

第三節:PHP 中的類別和物件

定義類別

使用 class 關鍵字在 PHP 中定義一個類別,並說明如何為類別添加屬性和方法。

<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
*
* Class Person
* @package Rewrite\\ExerciseObjectOriented
*/
class Person
{
/** @var string 屬性-姓名 */
public string $name;

/** @var int 屬性-年齡 */
private int $age;

/**
* Person constructor.
*
* @param string $name
* @param int $age
*/
public function __construct(string $name, int $age)
{
$this->name = $name;
$this->age = $age;
}

/**
* 方法-取得年齡
*
* @return int
*/
public function getAge(): int
{
return $this->age;
}

/**
* 方法-設定年齡
*
* @param int $age
*/
public function setAge(int $age): void
{
$this->age = $age;
}
}

  • 創建物件:介紹如何使用 new 關鍵字從類別創建物件的實例。
    // 創建一個 Person 類別的實例
    $person = new Person();

    $person->name = "張三"; // 因為「name」是公開的,所以可以直接『存取』設定屬性值

    $person->setAge(20); // 調用方法
    echo $person->getAge(); // 輸出年齡



第四節:為何使用物件導向程式設計

封裝(Encapsulation)

封裝是 OOP 的一大特點,它讓物件的詳細實現隱藏起來,只露出有限的介面供外部使用。這樣不僅保證了數據的安全性,也提高了代碼的可維護性。在上述的 Person 類別中,age 屬性就是被封裝起來的,外部只能透過 setAgegetAge 方法來訪問。

封裝不僅是隱藏數據,更重要的是抽象化的過程,提供清晰的界面,讓使用者不需要關心物件內部的實現細節,只需要通過這些界面來與物件互動。這樣,即使內部實現變化,只要介面保持不變,使用該物件的程式碼就不需要做任何改動。

繼承(Inheritance)

繼承讓子類別可以繼承父類別的屬性和方法,而無需從零開始重寫。例如,如果有一個基礎類別叫做 Vehicle,我們可以創建一個 Car 類別來繼承它:

<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
* 交通工具
*
* Class Vehicle
* @package Rewrite\\ExerciseObjectOriented
*/
class Vehicle
{
/** @var string 廠牌 */
public string $brand;

/**
* @return void
*/
public function start(): void
{
echo "發動引擎";
}
}
<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
* 汽車
* Car 繼承 Vehicle
*
* Class Car
* @package Rewrite\\ExerciseObjectOriented
*/
class Car extends Vehicle
{
/**
* @return void
*/
public function openTrunk()
{
echo "打開後車廂";
}
}
$car = new Car();
$car->brand = "Toyota";
$car->start(); // 繼承自 Vehicle 類別
$car->openTrunk(); // Car 類別自己的方法

多型(Polymorphism)

多型指的是不同類別的物件可以透過相同的介面進行操作。在 PHP 中,我們通常透過介面(Interface)或抽象類別(Abstract Class)來實現多型,這部分我們後續在延伸說明。


第五節:動手試試看

  • 練習1:定義一個 Person 類別,包含 nameage 屬性,以及一個顯示個人資訊的方法。
    class Person {
    /**
    * 自行定義內容
    */
    }

    // 執行端結果
    $person1 = new Person("王小明", 25);
    $person1->introduce(); // 輸出: 我的名字是 王小明,今年 25 歲。

  • 練習2:創建一個 Student 類別,繼承自 Person 類別,新增學號(studentID)屬性和學習(study)方法。
    class Student extends Person {
    /**
    * 自行定義內容
    */
    }

    $student = new Student("林小花", 20);
    $student->studentID = "B123456789";
    $student->introduce(); // 繼承自 Person 類別
    $student->study(); // Student 類別自己的方法


透過這些內容,我們可以獲得物件導向程式設計的初步理解,為進一步探索 PHP 中的 OOP 概念打下基礎。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.