Zend_Registry 提供應用程式層級的全域物件儲存機制,類似「物件倉庫」,讓你在專案任何位置存取共享資源(如資料庫連線、設定物件、View 實例等)。本文詳細說明靜態用法、陣列存取、物件屬性存取、迭代、擴充與實例管理。
<?php
// 設定值
Zend_Registry::set('db', $dbAdapter);
Zend_Registry::set('config', $configArray);
// 取得值
$db = Zend_Registry::get('db');
$config = Zend_Registry::get('config');
// 檢查是否存在
if (Zend_Registry::isRegistered('db')) { /* ... */ }
?>
取得靜態實例後可像陣列操作:
<?php $registry = Zend_Registry::getInstance(); $registry['cache'] = $cacheObj; var_dump($registry['cache']); unset($registry['cache']); ?>
需在 Bootstrap 階段初始化:
<?php $registry = new Zend_Registry([], ArrayObject::ARRAY_AS_PROPS); Zend_Registry::setInstance($registry); $registry->db = $dbAdapter; echo $registry->db; // 直接存取屬性 ?>
注意:某些 PHP 版本搭配 ARRAY_AS_PROPS 可能有 Bug,生產環境請充分測試。
<?php
$registry = Zend_Registry::getInstance();
foreach ($registry as $index => $value) {
echo "Registry index $index contains:\n";
var_dump($value);
}
?>
<?php
class My_Registry extends Zend_Registry {
public function getOrCreate($key, callable $factory) {
if (!$this->offsetExists($key)) {
$this->offsetSet($key, $factory());
}
return $this->offsetGet($key);
}
}
// 於 Bootstrap 設定
Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('service', $serviceObj);
?>
若靜態實例已初始化,再呼叫setClassName()會拋出例外,需先呼叫_unsetInstance()清除。
<?php Zend_Registry::_unsetInstance(); // 所有資料將遺失,不可恢復 // 之後可重新 setClassName() 或 setInstance() ?>
Zend_Db_Adapter)跨模組共用。Zend_Config)集中管理。Zend_View)於 Controller 與 Helper 間傳遞。Zend_Cache)單例模式替代方案。