第25章 Zend_Registry

目次

25.1. レジストリの使用法
25.1.1. レジストリへの値の設定
25.1.2. レジストリからの値の取得
25.1.3. レジストリオブジェクトの作成
25.1.4. レジストリへの配列風のアクセス
25.1.5. オブジェクト形式でのレジストリへのアクセス
25.1.6. インデックスが存在するかどうかの確認
25.1.7. レジストリの拡張
25.1.8. 静的レジストリの削除

25.1. レジストリの使用法

レジストリは、アプリケーション空間でオブジェクトや変数を保存するためのコンテナです。 変数をレジストリに保存すると、そのオブジェクトは アプリケーション内でいつでも利用できるようになります。 この仕組みは、グローバルなストレージを使用する代わりに使用できます。

レジストリの典型的な使用法は、Zend_Registry クラスの静的メソッドを用いるものです。 一方、このクラスは配列オブジェクトでもあるので、 配列風のインターフェイスでアクセスすることもできます。

25.1.1. レジストリへの値の設定

あるエントリをレジストリに保存するには、静的メソッド set() を使用します。

例 25.1. set() メソッドの例

<?php

Zend_Registry::set('index', $value);

?>

値としては、オブジェクトや配列、スカラーを指定することができます。 レジストリの特定のエントリに保存されている値を変更するには、 set() を使用して新しい値を指定します。

インデックスにはスカラー値を指定します。文字列あるいは整数のいずれかで、 通常の配列と同じです。

25.1.2. レジストリからの値の取得

エントリの内容をレジストリから取得するには、静的メソッド get() を使用します。

例 25.2. get() メソッドの例

<?php

$value = Zend_Registry::get('index');

?>

getInstance() メソッドは、 静的なレジストリオブジェクトを返します。

レジストリオブジェクトは順次処理をすることが可能 (iterable) です。

例 25.3. レジストリの順次処理の例

<?php

$registry = Zend_Registry::getInstance();

foreach ($registry as $index => $value) {
    echo "レジストリのインデックス $index に含まれる内容:\n";
    var_dump($value);
}

?>

25.1.3. レジストリオブジェクトの作成

静的メソッドを使用して静的なレジストリにアクセスするだけでなく、 直接インスタンスを作成し、それをオブジェクトとして使用することもできます。

静的メソッドでアクセスするレジストリインスタンスは、 単なるインスタンスのひとつであり、静的に格納されています。 そのため、アプリケーション内のどこからでもアクセスできます。

レジストリのインスタンスを作成するには、 ごく普通に new コンストラクタを使用します。 これにより、レジストリのエントリを連想配列として初期化できるようになります。

例 25.4. レジストリを作成する例

<?php

$registry = new Zend_Registry(array('index' => $value));

?>

このインスタンスを作成すると、配列風の方法でアクセスできるようになります。 あるいは、静的メソッド setInstance() を使用することで、このインスタンスを静的インスタンスに設定することもできます。

例 25.5. 静的レジストリの初期化の例

<?php

$registry = new Zend_Registry(array('index' => $value));

Zend_Registry::setInstance($registry);

?>

setInstance() メソッドは、もしすでに 静的レジストリが初期化されている場合に Zend_Exception をスローします。

25.1.4. レジストリへの配列風のアクセス

複数の値を取得したり設定したりする場合は、 配列風の記法でアクセスすると便利でしょう。

例 25.6. 配列アクセスの例

<?php

$registry = Zend_Registry::getInstance();

$registry['index'] = $value;

var_dump( $registry['index'] );

?>

25.1.5. オブジェクト形式でのレジストリへのアクセス

オブジェクト指向の方式で、 インデックス名をオブジェクトのプロパティとしてアクセスできると便利でしょう。 そうするには、オプション ArrayObject::ARRAY_AS_PROPS を指定してレジストリオブジェクトを明示的に作成し、 静的インスタンスを初期化しなければなりません。 これは、静的レジストリへの最初のアクセスが発生する前に行う必要があります。 このオプションを使用する際には 注意 しましょう。PHP のバージョンによっては、 このオプションを指定してレジストリを使用するとバグが発生することがあります。

例 25.7. オブジェクト形式のアクセスの例

<?php

// アプリケーションの起動ファイルでの記述
$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);

?>

25.1.6. インデックスが存在するかどうかの確認

レジストリの特定のインデックスが値を持っているかどうかを調べるには、 静的メソッド isRegistered() を使用します。

例 25.8. isRegistered() メソッドの例

<?php

if (Zend_Registry::isRegistered($index)) {
    $value = Zend_Registry::get($index);
}

?>

レジストリの特定のインデックスが値を持っているかどうかを配列風に調べるには、 通常の配列と同様に isset() を使用します。

例 25.9. isset() メソッドの例

<?php

$registry = Zend_Registry::getInstance();

// 配列風の構文でのアクセス
if (isset($registry['index'])) {
    var_dump( $registry['index'] );
}

// 有効にしていれば、オブジェクト形式でのアクセスも可能です
if (isset($registry->index)) {
    var_dump( $registry->index );
}

?>

25.1.7. レジストリの拡張

静的レジストリは Zend_Registry クラスのインスタンスです。 レジストリに何らかの機能を追加したい場合は、 Zend_Registry を継承したクラスを作成し、 それを静的レジストリで使用するクラスとして指定します。 クラスを指定するには、静的メソッド setClassName() を使用します。 このクラスは Zend_Registry を継承していなければなりません。

例 25.10. 静的レジストリのクラス名を指定する例

<?php

Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);

?>

最初にレジストリにアクセスした後でクラス名を設定しようとすると、 レジストリは Zend_Exception をスローします。静的レジストリのクラス名は、 アプリケーションの起動ファイルで指定することをお勧めします。

25.1.8. 静的レジストリの削除

通常は不要ですが、レジストリの静的インスタンスを削除することもできます。 その際には、静的メソッド _unsetInstance() を使用します。

[注意] データを失うリスク

_unsetInstance() を使用すると、 静的レジストリ内の全データが破棄され、 復旧することはできません。

このメソッドを使用するのは、たとえば、 静的レジストリオブジェクトを初期化した後で setInstance()setClassName() を使用する場合です。静的インスタンスを削除することで、 これらのメソッドを使用できるようになります。

例 25.11. _unsetInstance() メソッドの例

<?php

Zend_Registry::set('index', $value);

Zend_Registry::_unsetInstance();

// クラスを変更します
Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);

?>