0

ダイナミック ナビゲーション クラスを作成しようとしています。

class myApp_Helper_Breadcrum{
    protected $navigationArray=array();
    private static $_instance = null;
    public static function getInstance()
    {
         if (!isset(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    private function __construct() {
         $this->navigationArray = array();
    }

    public  function popin($popInElement){
        array_push($this->navigationArray,$popInElement);
    }

    public  function displayLinks()
    {
          //print array
    }
}

ブーストラップで私は次のことをしました

$nlinks=myApp_Helper_Breadcrum::getInstance();
Zend_Registry::set('nlinks',$nlinks);

今私のコントローラーで私は次のように呼んでいます

$nlinks= Zend_Registry::get('nlinks');
$nlinks->popin('Home');
$nlinks->displayLinks();

問題は、このクラスがシングルトンであっても、コンストラクターが何度も呼び出され、配列が初期化されることです。私が達成しようとしているのは、サイトをナビゲートするときにナビゲーション配列のアイテムを押し続けることです。

なぜZFでこのようになっているのか考えていますか?

4

4 に答える 4

2

クラスの状態を維持するための JVM がある場合、PHP は Java のようには実行されません。Java では、説明したとおりにシングルトンを動作させることができますが、PHP では、すべてのクラスが後続の Web サーバーへの呼び出しごとに更新されます。そのため、サーバーへの呼び出しの間、シングルトンはそのまま残りますが、応答が送信されると、次の呼び出しで最初からやり直します。

連続した呼び出しで状態を維持したい場合は、$_SESSION を使用して状態を追跡する必要があります。

編集:上記の私の答えは、PHP全般を扱っており、特にZend Frameworkではありません。以下の私のコメントを参照してください。

于 2012-10-23T09:11:20.930 に答える
0

私はまったく同じ問題に遭遇しました。問題は、クラスの永続性がリクエスト スコープにあることです。また、zend を使用すると、1 つのページの読み込みに対して複数のリクエストを行うこともできます。

PHP はシェアード ナッシング アーキテクチャです。各リクエストは新しいプロセスで開始され、リクエストの終了時にすべて破棄されます。独自のキャッシングを行わない限り、リクエスト間で永続化することはできません。オブジェクトをシリアル化して復元することはできますが、実際には、ほとんどの場合、これによるメリットはほとんどありません (特にリソース ハンドルに関しては、あらゆる種類の問題に遭遇することがよくあります)。

永続性のために Zend_cache を使用することをお勧めします

于 2012-11-23T15:01:46.717 に答える
0

コンポーネントを次のように定義してみてください。

class MyApp_Helper_Breadcrum
{
    private static $_instance = null; // use private here

    public static function getInstance()
    {
        if (self::$_instance === null) { // use strictly equal to null
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    private function __construct() // use private here
    {
         // ...
    }

    // ...
}
于 2012-10-23T09:06:14.190 に答える