物件導向編程在 PHP 中

物件導向概念

物件導向編程(OOP)是一種編程範式,使用「物件」來設計應用程式和軟體。這些物件是類別的實例,可以包含以字段形式存在數據,也稱為屬性;以及以過程形式存在的代碼,也稱為方法。物件導向編程的主要原則是封裝、繼承和多態。

PHP - Object Oriented Programming

定義 PHP 類別

在 PHP 中,您使用 class 關鍵字來定義一個類別。一個類別是創建物件時的藍圖。它定義了一組屬於同一類型所有物件的屬性和方法。

class Car {
// 類別屬性和方法放在這裡
}

在 PHP 中創建物件

要從類別創建一個物件,您使用 new 關鍵字,然後接上類別名稱。

$myCar = new Car();

調用成員函數

成員函數是在類別內定義的,用於對物件的屬性執行操作。您使用物件操作符 -> 在物件上調用成員函數。

$myCar->drive(); // 在 $myCar 物件上調用 drive 方法

构造函数

構造函數是一個特殊的方法,當從類別創建物件時會自動調用。它用於初始化物件的屬性。

class Car {
public function __construct() {
// 在這裡初始化屬性
}
}

解構函数

解構函數是一個特殊的方法,當物件被摧殘或超出作用域時會自動調用。它用於執行清理任務,如關閉數據庫連接或釋放記憶體。

class Car {
public function __destruct() {
// 在這裡放置清理任務
}
}

繼承

繼承允許一個類別從另一個類別繼承屬性和方法。被繼承的類別稱為父類別,而繼承的類別稱為子類別。

class ElectricCar extends Car {
// ElectricCar 繼承 Car 的屬性和方法
}

函数重寫

函數重寫允許子類別提供一個與其在父類別中已經定義的方法不同的實現。

class ElectricCar extends Car {
public function drive() {
// drive 方法不同的實現
}
}

公共成員

公共成員從類別內部和外部都可以訪問。

class Car {
public $color; // 公共屬性
public function drive() { // 公共方法
// 代碼放在這裡
}
}

私有成員

私有成員只能在定義它的類別內訪問。它們不能從類別外部訪問。

class Car {
private $color; // 私有屬性
private function drive() { // 私有方法
// 代碼放在這裡
}
}

被保護成員

被保護成員在定義它的類別以及任何子類別中都可以訪問。

class Car {
protected $color; // 被保護屬性
protected function drive() { // 被保護方法
// 代碼放在這裡
}
}

介面

介面是一個合同,定義了一組類別必須實現的方法。如果一個類別實現了一個介面,它就承諾為介面中聲明的所有方法提供實現。

interface Drivable {
public function drive(); // 方法聲明
}

class Car implements Drivable {
public function drive() {
// drive 方法的實現
}
}

常量

常量是命名後不能更改的值。它們用於定義在程序執行過程中不應該更改的值。

class Car {
const MAX_SPEED = 100; // 常量值
}

抽象類別

抽像類別是一個不能被實例化且用於被其他類別繼承的類別。它可以包含抽像方法,即沒有實現的方法,以及具有實現的具體方法。

abstract class Vehicle {
abstract public function move(); // 抽像方法
public function stop() { // 具體方法
// 代碼放在這裡
}
}

靜態關鍵字

靜態關鍵字用於聲明屬性或方法屬於類別本身而不是類別的實例。靜態成員可以在不創建類別物件的情況下訪問。

class Car {
public static $count = 0; // 靜態屬性
public static function getCount() { // 靜態方法
return self::$count;
}
}

最終關鍵字

最終關鍵字用於防止類別被繼承,或方法被重寫。

final class Car {
// 這個類別不能被繼承
}

調用父類構造函數

當創建子類別時,您可能想要調用父類別的構造函數以初始化其某些屬性。您可以使用 parent 關鍵字,然後接上 :: 運算符和構造函數名稱來做到這一點。


class ElectricCar extends Car {
public function __construct() {
parent::__construct(); // 調用父類構造函數
// 附加初始化放在這裡
}
}

Credits: Image by storyset