Zend Framework 1.x 的 Zend_Registry 提供進程級的全域資料儲存,支援陣列初始化、物件屬性存取、靜態 set/get 等多種用法。本文通過完整代碼示例,系統梳理其核心用法與最佳實踐。
<?php
require_once("Zend/Loader.php");
Zend_Loader::loadClass("Zend_Registry");
$config = [
'host' => '127.0.0.1',
'username' => 'root',
'password' => '111',
'dbname' => 'test'
];
// 建構子注入陣列
$registry = new Zend_Registry($config);
echo "主機名:{$registry['host']}<br>";
echo "用戶名:{$registry['username']}<br>";
echo "密碼:{$registry['password']}<br>";
echo "資料庫:{$registry['dbname']}<br>";
echo "<hr>";
// 靜態 set/get 也可操作同一儲存空間
Zend_Registry::set('table_name', 'sanguo');
echo Zend_Registry::get('table_name'); // 輸出 sanguo
<?php
require_once("Zend/Loader.php");
Zend_Loader::loadClass("Zend_Registry");
// 1. 實例化
$reg = new Zend_Registry();
// 2. 註冊為全域單例
Zend_Registry::setInstance($reg);
// 3. 以物件屬性寫入
$reg->name = '張三';
$reg->sex = '男';
$reg->age = '18';
// 4. 任意處透過 getInstance() 讀取
$reg = Zend_Registry::getInstance();
echo "姓名為:{$reg->name}<br>";
echo "性別為:{$reg->sex}<br>";
echo "年齡為:{$reg->age}<br>";
<?php
$arr = ['姓名' => '張三', '年齡' => '18', '愛好' => '上網'];
Zend_Registry::set('My', $arr);
class Person {
public function My() {
$data = Zend_Registry::get('My');
echo "我的姓名是:{$data['姓名']}<br>";
echo "我的年齡是:{$data['年齡']}<br>";
echo "我的愛好是:{$data['愛好']}<br>";
}
}
$p = new Person();
$p->My();
| 方法 | 用途 | 備註 |
|---|---|---|
| new Zend_Registry($array) | 建構子批量寫入 | 僅在首次建立時有效 |
| Zend_Registry::setInstance($obj) | 註冊單例物件 | 全域唯一,後續 getInstance() 返回此物件 |
| Zend_Registry::getInstance() | 取得單例物件 | 物件模式專用 |
| Zend_Registry::set($key, $val) | 靜態寫入 | 鍵值對,支援任意型別 |
| Zend_Registry::get($key) | 靜態讀取 | 不存在返回 null |
| $registry[$key] | 陣列式讀寫 | 物件實現 ArrayAccess 介面 |
setInstance 一次,重複呼叫會拋出異常。config.db.host)避免鍵名衝突。善用 Zend_Registry 可減少全域變數汙染,統一管理配置、服務實例等共享資源,是 ZF1 專案架構中的基石組件。