類別是定義對象的模板,用來描述對象有哪些屬性和方法。
建構子是一種特殊的方法,在創建類的新實例(對象)時自動調用,用於初始化對象的屬性。
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$person = new Person("Alice");
echo $person->name; // 輸出:Alice
公開訪問修飾符表示類的成員可以在類的內部和外部被訪問。
class Car {
public $brand; // 公開屬性
public function __construct($brand) {
$this->brand = $brand;
}
public function drive() {
echo "Driving the $this->brand car.";
}
}
$car = new Car("Toyota");
echo $car->brand; // 可以訪問公開屬性
$car->drive(); // 可以調用公開方法
私有訪問修飾符表示類的成員只能在該類的內部訪問,無法在外部直接訪問。
class BankAccount {
private $balance; // 私有屬性
public function __construct($initialBalance) {
$this->balance = $initialBalance;
}
public function deposit($amount) {
$this->balance += $amount;
}
public function withdraw($amount) {
if ($amount <= $this->balance) {
$this->balance -= $amount;
} else {
echo "Insufficient funds.";
}
}
public function getBalance() {
return $this->balance; // 可以在內部訪問私有屬性
}
}
$account = new BankAccount(1000);
// $account->balance; // 無法直接訪問私有屬性
echo $account->getBalance(); // 可以間接訪問私有屬性的值
$account->deposit(500);
echo $account->getBalance(); // 輸出:1500
// $account->balance = 5000; // 無法直接設置私有屬性
受保護訪問修飾符表示類的成員可以在該類的內部和其子類中訪問,但無法在外部直接訪問。
class Vehicle {
protected $type; // 受保護屬性
protected function setType($type) {
$this->type = $type;
}
protected function getType() {
return $this->type;
}
}
class Car extends Vehicle {
public function __construct($type) {
$this->setType($type); // 可以在子類中訪問受保護方法
}
public function displayType() {
echo "Vehicle type: " . $this->getType(); // 可以在子類中訪問受保護方法
}
}
$car = new Car("SUV");
$car->displayType(); // 輸出:Vehicle type: SUV
// $car->setType("SUV"); // 無法在外部訪問受保護方法或屬性
// echo $car->getType(); // 無法在外部訪問受保護方法或屬性
繼承是指一個類(子類)從另一個類(父類)獲得屬性和方法的能力,可以重用和擴展父類的功能。
class Animal {
public function sound() {
echo "Animal makes a sound";
}
}
class Dog extends Animal {
public function sound() {
echo "Dog barks";
}
}
$dog = new Dog();
$dog->sound(); // 輸出:Dog barks
多型是指同一個方法在不同的類中可以有不同的實現方式。它提供了靈活性和擴展性。
class Animal {
public function sound() {
echo "Animal makes a sound";
}
}
class Dog extends Animal {
public function sound() {
echo "Dog barks";
}
}
class Cat extends Animal {
public function sound() {
echo "Cat meows";
}
}
function makeSound(Animal $animal) {
$animal->sound();
}
$dog = new Dog();
$cat = new Cat();
makeSound($dog); // 輸出:Dog barks
makeSound($cat); // 輸出:Cat meows
封裝是一種將數據和操作數據的方法結合在一起的概念,通過訪問修飾符(public、private、protected)來控制對類的成員的訪問權限,達到隱藏內部實現的目的。
class Person {
private $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$person = new Person();
$person->setName("Alice");
echo $person->getName(); // 輸出:Alice
介面是一種僅包含方法聲明但不包含實現的抽象類型。類可以實現(implement)介面,並實現介面中定義的方法。
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
// 實現記錄日誌到文件的方法
}
}
抽象類別是不能被實例化的類,用 abstract
關鍵字聲明,可以包含抽象方法和實現方法。
abstract class Shape {
abstract public function area();
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * pow($this->radius, 2);
}
}
靜態類別是指包含靜態成員(屬性和方法)的類,靜態成員可以在不創建類的實例的情況下訪問。
class MathUtility {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathUtility::add(5, 3); // 輸出:8
列舉是一種特殊的類型,用於定義一組具名的常量值。在 PHP 中,通常使用 enum
擴展來實現列舉。
enum WeekDays {
case Monday;
case Tuesday;
case Wednesday;
// 其他日子...
}
$day = WeekDays::Monday;
在 PHP 中,"委派" 通常指的是事件委派,可以用來實現事件和事件處理器的分離。
Lambda 表達式是一種匿名函數,可以作為參數傳遞給其他函數。
$add = fn($a, $b) => $a + $b;
echo $add(5, 3); // 輸出:8
泛型是一種在類、接口、函數等中使用型別參數(type parameter)的機制,用來實現更靈活的程式碼重用和類型安全。
class Box<T> {
private $value;
public function __construct(T $value) {
$this->value = $value;
}
public function getValue(): T {
return $this->value;
}
}
反射是指在運行時動態地檢查、操作類型(類、屬性、方法等)的能力,使得可以在運行時探索和使用 PHP 代碼的內部結構。
class MyClass {
private $name;
}
$reflectionClass = new ReflectionClass('MyClass');
$properties = $reflectionClass->getProperties(ReflectionProperty::IS_PRIVATE);
foreach ($properties as $property) {
echo $property->getName(); // 輸出:name
}