PHP 物件變數持有的是「物件識別符」(handle),指派/參數傳遞複製的是識別符,指向同一實體。不是傳址呼叫。
$a = new A; $a->foo = 1;
$b = $a; // 複製識別符,$a、$b 指向同一物件
$b->foo = 2; // $a->foo 也變 2
$c = new A;
$d = &$c; // 真正的引用,$c、$d 綁定同一變數
class Sub { public $id; public function __construct() { $this->id = ++self::$cnt; } }
class Main {
public $sub;
public function __clone() {
$this->sub = clone $this->sub; // 深拷貝子物件
}
}
$o1 = new Main; $o1->sub = new Sub;
$o2 = clone $o1; // $o2->sub 為新物件,id 不同
foreach ($obj as $k => $v) 僅遍歷可見屬性(public、同類別內的 protected/private)。Iterator 或 IteratorAggregate 可自定義遍歷行為。function process(User $user, array $data, callable $cb) { ... }
class Foo implements LoggerInterface { ... } // 介面約束
// PHP 7.0+ 支援 scalar type: int, string, bool, float
// PHP 8.0+ 支援 union types: int|string
// 不支援標量類型約束於舊版,Trait 也不可作為類型約束
$str = serialize($obj); // 字串含類別名、屬性值
$obj = unserialize($str); // 需先載入類別定義(autoload)
// 可實作 __sleep() 選擇序列化屬性、__wakeup() 還原後初始化
| 方法 | 觸發時機 |
|---|---|
__set($name, $value) | 寫入不可見屬性 |
__get($name) | 讀取不可見屬性 |
__isset($name) | isset()/empty() 不可見屬性 |
__unset($name) | unset() 不可見屬性 |
__call($name, $args) | 呼叫不可見實例方法 |
__callStatic($name, $args) | 靜態呼叫不可見方法 |