這一階段將對物件導向程式設計(OOP)的核心概念進行初步介紹,為後續更進階的學習奠定基礎。
類別是設計圖,描述了一組有相同屬性(Attribute)和方法(Method)的物件應有的結構。想像類別就像是製造汽車的設計藍圖,而物件則是根據這個藍圖生產出來的實際汽車。每一輛汽車(物件)都可以有不同的顏色或馬力(屬性值),但它們都是根據同一個設計藍圖(類別)製造的。
屬性是類別中用來存放資料的變數,你可以想像它們是物件的特徵,比如一個人類別(Person Class)的物件可能會有名字(Name)、年齡(Age)等屬性。
方法定義了物件能夠執行的操作,比如一個汽車物件可能有啟動(Start)和停止(Stop)的方法。方法在類別中定義,並且由物件來調用。
使用 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(); // 輸出年齡
封裝是 OOP 的一大特點,它讓物件的詳細實現隱藏起來,只露出有限的介面供外部使用。這樣不僅保證了數據的安全性,也提高了代碼的可維護性。在上述的 Person
類別中,age
屬性就是被封裝起來的,外部只能透過 setAge
和 getAge
方法來訪問。
封裝不僅是隱藏數據,更重要的是抽象化的過程,提供清晰的界面,讓使用者不需要關心物件內部的實現細節,只需要通過這些界面來與物件互動。這樣,即使內部實現變化,只要介面保持不變,使用該物件的程式碼就不需要做任何改動。
繼承讓子類別可以繼承父類別的屬性和方法,而無需從零開始重寫。例如,如果有一個基礎類別叫做 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 類別自己的方法
多型指的是不同類別的物件可以透過相同的介面進行操作。在 PHP 中,我們通常透過介面(Interface)或抽象類別(Abstract Class)來實現多型,這部分我們後續在延伸說明。
Person
類別,包含 name
和 age
屬性,以及一個顯示個人資訊的方法。class Person {
/**
* 自行定義內容
*/
}
// 執行端結果
$person1 = new Person("王小明", 25);
$person1->introduce(); // 輸出: 我的名字是 王小明,今年 25 歲。
Student
類別,繼承自 Person
類別,新增學號(studentID
)屬性和學習(study
)方法。class Student extends Person {
/**
* 自行定義內容
*/
}
$student = new Student("林小花", 20);
$student->studentID = "B123456789";
$student->introduce(); // 繼承自 Person 類別
$student->study(); // Student 類別自己的方法
透過這些內容,我們可以獲得物件導向程式設計的初步理解,為進一步探索 PHP 中的 OOP 概念打下基礎。