目次
レジストリは、アプリケーション空間でオブジェクトや変数を保存するためのコンテナです。 変数をレジストリに保存すると、 そのオブジェクトはアプリケーション内でいつでも利用できるようになります。 この仕組みは、グローバルなストレージを使用する代わりに使用できます。
レジストリの典型的な使用法は、Zend_Registry クラスの静的メソッドを用いるものです。 一方、このクラスは配列オブジェクトでもあるので、 配列風のインターフェイスでアクセスすることもできます。
あるエントリをレジストリに保存するには、静的メソッド
set() を使用します。
値としては、オブジェクトや配列、スカラーを指定することができます。
レジストリの特定のエントリに保存されている値を変更するには、
set() を使用して新しい値を指定します。
インデックスにはスカラー値を指定します。文字列あるいは整数のいずれかで、 通常の配列と同じです。
エントリの内容をレジストリから取得するには、静的メソッド
get() を使用します。
getInstance() メソッドは、
静的なレジストリオブジェクトを返します。
レジストリオブジェクトは順次処理をすることが可能 (iterable) です。
例 39.3. レジストリの順次処理の例
$registry = Zend_Registry::getInstance();
foreach ($registry as $index => $value) {
echo "レジストリのインデックス $index に含まれる内容:\n";
var_dump($value);
}
静的メソッドを使用して静的なレジストリにアクセスするだけでなく、 直接インスタンスを作成し、それをオブジェクトとして使用することもできます。
静的メソッドでアクセスするレジストリインスタンスは、 単なるインスタンスのひとつであり、静的に格納されています。 そのため、アプリケーション内のどこからでもアクセスできます。
レジストリのインスタンスを作成するには、
ごく普通に new コンストラクタを使用します。
これにより、レジストリのエントリを連想配列として初期化できるようになります。
このインスタンスを作成すると、配列風の方法でアクセスできるようになります。
あるいは、静的メソッド setInstance()
を使用することで、このインスタンスを静的インスタンスに設定することもできます。
例 39.5. 静的レジストリの初期化の例
$registry = new Zend_Registry(array('index' => $value));
Zend_Registry::setInstance($registry);
setInstance() メソッドは、もしすでに
静的レジストリが初期化されている場合に
Zend_Exception をスローします。
複数の値を取得したり設定したりする場合は、 配列風の記法でアクセスすると便利でしょう。
例 39.6. 配列アクセスの例
$registry = Zend_Registry::getInstance();
$registry['index'] = $value;
var_dump( $registry['index'] );
オブジェクト指向の方式で、
インデックス名をオブジェクトのプロパティとしてアクセスできると便利でしょう。
そうするには、オプション ArrayObject::ARRAY_AS_PROPS
を指定してレジストリオブジェクトを明示的に作成し、
静的インスタンスを初期化しなければなりません。
これは、静的レジストリへの最初のアクセスが発生する前に行う必要があります。
このオプションを使用する際には 注意
しましょう。PHP のバージョンによっては、
このオプションを指定してレジストリを使用するとバグが発生することがあります。
例 39.7. オブジェクト形式のアクセスの例
// アプリケーションの起動ファイルでの記述
$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
Zend_Registry::setInstance($registry);
$registry->tree = 'apple';
.
.
.
// アプリケーション内の別の関数で、
$registry = Zend_Registry::getInstance();
echo $registry->tree; // "apple" と出力します
$registry->index = $value;
var_dump($registry->index);
レジストリの特定のインデックスが値を持っているかどうかを調べるには、
静的メソッド isRegistered() を使用します。
例 39.8. isRegistered() メソッドの例
if (Zend_Registry::isRegistered($index)) {
$value = Zend_Registry::get($index);
}
レジストリの特定のインデックスが値を持っているかどうかを配列風に調べるには、
通常の配列と同様に isset() を使用します。
例 39.9. isset() メソッドの例
$registry = Zend_Registry::getInstance();
// 配列風の構文でのアクセス
if (isset($registry['index'])) {
var_dump( $registry['index'] );
}
// 有効にしていれば、オブジェクト形式でのアクセスも可能です
if (isset($registry->index)) {
var_dump( $registry->index );
}
静的レジストリは Zend_Registry クラスのインスタンスです。
レジストリに何らかの機能を追加したい場合は、
Zend_Registry を継承したクラスを作成し、
それを静的レジストリで使用するクラスとして指定します。
クラスを指定するには、静的メソッド
setClassName() を使用します。
このクラスは Zend_Registry を継承していなければなりません。
例 39.10. 静的レジストリのクラス名を指定する例
Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('index', $value);
最初にレジストリにアクセスした後でクラス名を設定しようとすると、 レジストリは Zend_Exception をスローします。静的レジストリのクラス名は、 アプリケーションの起動ファイルで指定することをお勧めします。
通常は不要ですが、レジストリの静的インスタンスを削除することもできます。
その際には、静的メソッド _unsetInstance()
を使用します。
![]() |
データを失うリスク |
|---|---|
|
このメソッドを使用するのは、たとえば、
静的レジストリオブジェクトを初期化した後で
setInstance() や setClassName()
を使用する場合です。静的インスタンスを削除することで、
これらのメソッドを使用できるようになります。
例 39.11. _unsetInstance() メソッドの例
Zend_Registry::set('index', $value);
Zend_Registry::_unsetInstance();
// クラスを変更します
Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('index', $value);