0

すべてのphpアプリケーションデータを1か所に保持する方法を見つけようとしています。たとえば、グローバル変数の使用を避けるために、パラメータ、ページタイトル、ページネーション結果などを取得して投稿します。

これは、すべてのデータを保持し、コントローラー間の交換を次のオブジェクトに保持することをお勧めしますか?

class container {

protected static $_instance;
protected $_instance_class;

public static function instance($instance_name = 'default')
{
    $c = __CLASS__;

    if ( ! isset($c::$_instance[$instance_name]))
    {
        $c::$_instance[$instance_name] = new $c();
        $c::$_instance[$instance_name]->_instance_class = $instance_name;
    }
    return $c::$_instance[$instance_name];
}

public function set($key, $val)
{
    // someting like $this->$key = $val;
}

public function get($key)
{
    // someting like retrun $this->$key;
}

}

そして、例えばモデルで

container::instance('messages')->set('error', 'some error');

コントローラーまたはビューで

container::instance('messages')->get('error');

または、アプリのどこからでもデータにアクセスできるようにする他の方法はありますか?

ありがとう!

4

3 に答える 3

1

あなたが話しているのはレジストリパターン(そしてそれに関する別の良い記事)と呼ばれています。いくつかの欠点がありますが(たとえば、レジ​​ストリからデータをフェッチするメソッドをテストするには、このレジストリもモックする必要があります)、グローバル変数やシングルトンを使用するよりも間違いなく優れています。

実際、Zend Framework 1では、このパターンは文字通り実装されています

// setting a value (usually done in Bootstrap)
Zend_Registry::set('index', $value);

// getting a value (usually in actions and/or models)
$value = Zend_Registry::get('index');

このアプローチの何が悪いのかを示すために、以下を分析してみましょう。

class FooController extends Zend_Controller_Action {
    public function barAction() {
        $baz = Zend_Registry::get('baz');
        $model = new Some_Model($baz); 
        ...
    }
}

質問は簡単です:$bazここでそれは何ですか?オブジェクトですか?または配列?または、関数やリソースなどの他の獣ですか?ここではコメントに依存する必要がありますが、それは通常は良いことではありません-些細で一般的なオブジェクト(クエリパラメータやデータベースリソースオブジェクトなど)を操作している場合を除きます。

于 2012-09-13T20:00:58.073 に答える
0

この種のものの静的クラスへのハードコーディングされた参照を持つことの問題は、それらの静的クラスへの厳密な依存関係を作成していることです。将来、「グローバル」プロパティのソースを変更することにした場合は、そのソースへの参照が散らばっているアプリケーションがあります。

ある程度グローバルなプロパティエンティティが必要な場合は、インスタンス化するものを作成し、アプリケーションのニーズに合わせたインターフェイスを提供することをお勧めします。議論のために、このインターフェースを呼び出しましょうGlobalConfigurationProvider。次に、アプリケーションコードは、の実装を期待(および依存)する可能性がありますGlobalConfigurationProviderGlobalConfigurationProviderこれで、将来構成を実装する方法を変更する場合、構成プロバイダーを参照しているすべてのクラス、ビューなどではなく、新しい要素(の新しいインスタンス)についてのみ心配する必要があります。

于 2012-09-13T19:58:02.863 に答える
0

グローバルコンテナクラスを使用する代わりに、OOのプログラミングを検討し、メソッドと変数を1つのクラスにまとめます。

エラーの例では、エラーはクラスに属しているため、そこに保持する必要があります。

クラスへの参照は、グローバルレジストリ、またはより適切にはIoCコンテナによって保持される可能性があります。

于 2012-09-13T20:04:04.070 に答える