PHP 5 完全重寫物件處理機制:物件儲存於獨立 Object Store,zval 僅保存指標(handle)。複製物件或傳參數時不再複製內容,而是共享指標——物件預設以參考傳遞,無需 & 宣告。舊程式碼幾乎無需修改即可相容。
private:僅本類別可存取protected:本類別與子類別可存取public:公開存取(預設)同時支援方法可見性,子類別可覆寫 protected/public 方法,private 方法不可繼承。
abstract class AbstractClass {
abstract public function test();
}
interface Throwable {
public function getMessage();
}
class Exception implements Throwable {
public function getMessage() { /* ... */ }
}
抽象類別不可實例化;介面定義契約,類別可實作多個介面。
function foo(Foo $obj) { ... }
// 等同於運行時檢查:
function foo($obj) {
if (!($obj instanceof Foo)) die("Argument must be Foo instance");
}
僅適用物件類型,運行時檢查而非編譯期。
final class Foo { } // 不可被繼承
class Bar { final function baz() { } } // 方法不可被覆寫
$copy = clone $object; // 呼叫 __clone()
class MyCloneable {
function __clone() {
$this->id = self::$nextId++; // 重新生成 ID
$this->resource = new Resource(); // 重新取得資源
}
}
未定義 __clone() 時預設淺複製所有屬性。
class Base {
function __construct() { print "Base\n"; }
}
class Sub extends Base {
function __construct() {
parent::__construct(); // 明確呼叫父建構子
print "Sub\n";
}
function __destruct() {
parent::__destruct(); // 明確呼叫父解構子
print "Cleanup\n";
}
}
相容舊式同名建構子;解構子於最後一個參考消失時自動呼叫。
class Foo {
const CONSTANT = 'value';
const A = 1<<0;
const B = 1<<1;
const C = self::A | self::B; // 編譯期計算
}
echo Foo::CONSTANT;
try {
throw new MyException("Error");
} catch (MyException $e) {
echo $e->getMessage();
} finally { // PHP 5.5+
// 清理工作
}
static $var、static function()、Class::$var、Class::method()__call()、__get()、__set() 處理未定義方法/屬性存取function(&$var = null)