本系列筆記源自《Core PHP Programming》「Classes and Objects」一章。第六節聚焦於物件實例的屬性與方法存取語法、鏈式操作、繼承存取與特殊命名空間(parent/self)。
-> 運算子物件屬性如同一般變數,**但存取時必須使用 ->,且屬性名不加 $ 符號**:
<?php
class Room {
public $name;
public function __construct($name = 'unnamed') { $this->name = $name; }
}
class House {
public $rooms = [];
}
$home = new House();
$home->rooms[] = new Room('bedroom');
$home->rooms[] = new Room('kitchen');
$home->rooms[] = new Room('bathroom');
// 存取巢狀物件屬性:鏈式 ->
echo $home->rooms[0]->name; // 輸出: bedroom
?>
$home->rooms 取得陣列[0] 取得第一個 Room 物件->name 存取該物件的 name 屬性->方法執行語義與一般函數一致,唯須透過物件實例:
$user = new User('Leon', 'secret');
echo $user->getLastLogin(); // 呼叫方法並輸出回傳值
子類繼承父類所有 public 與 protected 屬性與方法,**存取方式與自有成員完全相同**;若需顯式呼叫父類實現,使用 :: 搭配 parent 命名空間:
class Animal {
public $blood;
public function __construct($blood, $name = null) {
$this->blood = $blood;
if ($name) $this->name = $name;
}
}
class Mammal extends Animal {
public $furColor;
public function __construct($furColor, $legs, $name = null) {
parent::__construct('warm', $name); // 顯式呼叫父類建構子
$this->furColor = $furColor;
$this->legs = $legs;
}
}
class Dog extends Mammal {
public function __construct($furColor, $name) {
parent::__construct($furColor, 4, $name);
self::bark(); // 在建構子中呼叫自身靜態/實例方法
}
public function bark() { echo "$this->name says 'woof!'"; }
}
$d = new Dog('Black and Tan', 'Angus'); // 輸出: Angus says 'woof!'
PHP 允許執行時以變數決定存取的屬性或方法:
$prop = 'name';
$method = 'getLastLogin';
echo $obj->$prop; // 存取 $obj->name
echo $obj->$method(); // 呼叫 $obj->getLastLogin()
PHP 5 允許直接對方法回傳值繼續呼叫 ->,無需中介變數:
$obj->getFactory()->createProduct()->process();
此特性支援 Factory、Builder、Fluent Interface 等設計模式,讓 API 更具表達力。
雙引號字串可直接內嵌物件屬性存取(方法需用 {} 包裹):
echo "User: {$user->name}, Last login: {$user->getLastLogin()}";
| 語法 | 用途 | 範例 |
|---|---|---|
$obj->prop | 存取實例屬性 | $user->name |
$obj->method() | 呼叫實例方法 | $user->getLastLogin() |
$obj->$varProp | 動態屬性名 | $p='name'; $obj->$p |
$obj->$varMethod() | 動態方法名 | $m='getName'; $obj->$m() |
parent::method() | 呼叫父類方法 | parent::__construct() |
self::method() | 呼叫當前類靜態/實例方法 | self::bark() |
$a->b()->c() | 方法鏈式呼叫 | $factory->create()->run() |
掌握這些存取語法,是駕馭 PHP 5 物件模型、實現多型與設計模式的基石。