PHP 5 正式釋出,核心升級為 Zend Engine 2.0,帶來類似 Java 的完整物件導向特性。本文整理官方文件重點,幫助開發者快速掌握變更。
PHP 4 物件像純量變數,賦值或傳參會複製整個物件。PHP 5 透過「控制代碼」引用同一實例:
$obj1 = new MyClass();
$obj2 = $obj1; // 兩者指向同一物件
$obj2->property = 'new'; // $obj1->property 也變了
既有程式碼多數無需修改即可相容。
class MyClass {
private $secret = 'hidden';
protected $family = 'inherited';
public $open = 'visible';
function printAll() {
echo $this->secret; // 可存取
echo $this->family; // 可存取
echo $this->open; // 可存取
}
}
class Child extends MyClass {
function test() {
// echo $this->secret; // Fatal error: 私有不可存取
echo $this->family; // 正常
echo $this->open; // 正常
}
}
abstract class Shape {
abstract public function area();
}
class Circle extends Shape {
public function area() { return pi() * $this->r * $this->r; }
}
抽象類別不可實例化,子類別必須實作所有抽象方法。
interface Throwable {
public function getMessage();
}
class Exception implements Throwable {
public function getMessage() { /* ... */ }
}
類別可實作多個介面,支援多型設計。
function process(Foo $obj) { /* ... */ }
// 相當於執行期檢查
if (!($obj instanceof Foo)) die('Type mismatch');
僅適用於物件型別,不支援純量型別。
class Base {
final public function fixed() { /* 不可覆寫 */ }
}
class MyClass {
public $id;
public function __clone() {
$this->id = uniqid(); // 複製時產生新 ID
}
}
$copy = $obj->__clone();
若未定義 __clone,預設淺層複製所有屬性。
class Base {
function __construct() { echo "Base"; }
}
class Derived extends Base {
function __construct() {
parent::__construct();
echo "Derived";
}
}
相容性:找不到 __construct 時退回同名類別方法。
class DB {
function __construct() { $this->conn = mysql_connect(...); }
function __destruct() { mysql_close($this->conn); }
}
物件最後一個參考消失時自動呼叫,需手動呼叫 parent::__destruct() 觸發父類別解構。
class Config {
const VERSION = '1.0';
}
echo Config::VERSION; // 編譯期解析,不可變更
__construct、__destruct、__clone、final、private、protected、abstract、interface、implements 等新保留字作為方法名。