ZendのRegistryメカニズムの使用説明

2415 ワード

プロジェクト中にグローバル変数がたくさんありますが、グローバルストレージが必要です.グローバル変数を使用してストレージしますか?それは弱いですね.ZendはRegistryメカニズム(レジストリ)を使用してオブジェクトと値を格納し、オブジェクトと値を格納するコンテナです.
Zend_レジストリというクラスがこの目的です
コード例Zend_Registry::set('config', $config); Zend_Registry::get('config');
コード解析この2つの関数は最もよく使われる2つの関数です.このクラスを見てみましょう
class Zend_Registry extends ArrayObject
このクラスはArrayObjectから継承されています
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable
ArrayObjectはオブジェクト集合であり,他言語の汎用集合の概念に相当する.
void ArrayObject::offsetSet(mixed$index,mixed$newval)を重点的に理解します.この関数はhashtableの設定key,valueです.keyだけです.valueは任意のタイプです.
さあZendに戻りますRegistry setが何をしたか見てみろ
set関数
 
  
public static function set($index, $value)
    {
        $instance = self::getInstance();
        $instance->offsetSet($index, $value);

    }

1つはRegisterをインスタンス化し、もう1つはoffsetSetメソッドを呼び出してindexとvalueを設定します.
offsetメソッドはわかりやすいですが、なぜgetInstanceメソッドを使うのでしょうか?
ここでは,クラス静的手法を組み合わせた単一のパターンをよく見ることを提案する.
一般的な単一のパターンは次のように書かれています.
 
  
class A{
    private $_instance;
    public static function getInstance(){
        ...
    }

    protected function __construct(){
        ...
    }

    public function setVal(){
        ...
    }
}

$a = A::getInstance();

$a->setVal();

このように呼び出しの前にクラスをインスタンス化する必要があります.このインスタンス化は実際には単一の例ですが、気分が悪いです.
こちらのregisterでは静的メソッド呼び出しを直接使用できます
A::setVal();
大体のコードの構想は私がdemoを書きました
 
  
class A{
    private static $_instance;
    public static function getInstance(){
        if(self::_instance !==null){
            return $this->_instance;
        } else {
            return new A();
        }
    }

    public function __construct(){

    }

    public static function setV(){
        $a = self::getInstance();
        $a->setVal();
    }

    public function setVal(){
        ...
    }
}

A::setV();

実際にはそのまま_construct()を放してpublicにし、インスタンス化します.