5

静的変数とシングルトンパターンを使用すると、別のページが読み込まれたときにカート内のどのアイテムを記憶しているかを覚えている簡単なショッピングカートを作成するのは簡単だと思いました。

ページが更新されたときにショッピングカートに何が入っていたかを思い出せないという問題があります。

以下のコードに問題がありますか、それともグローバルまたはmysqlデータベースを使用する必要がありますか。

状態を保存するための最良の方法は何ですか。

<?php
//create a singleton class
class shoppingCart {

    private static $_shoppingCartItems = array();
    private static $_instance = null;

    private function __construct(){

    }

    public static function getInstance(){
        if(self::$_instance == null)
            self::$_instance = new shoppingCart();
        return self::$_instance;            
    }


    public function add(ShoppingItem $item){
        $this->_shoppingCartItems[] = $item;
    }

    public function cartCount(){                 
        return count($this->_shoppingCartItems);
    }  
}
?>

実装

$item = new shoppingItem();

$shoppingCart = shoppingCart::getInstance();
$shoppingCart->add($item);
$shoppingCart->add($item);

//should increment by 2 on each page load but it doesn't
echo $shoppingCart->cartCount(); 
4

3 に答える 3

5

静的クラスメンバー(またはその他の変数)は、さまざまなリクエスト間で保持されません。一度もない。

救助へのセッション

これに対する唯一の例外は$_SESSION;です。これはまさにそれを可能にする特別なメカニズムです。

session_start()スクリプトの上部でセッションにスターを付けます。

$_SESSIONこれで、通常の配列のように使用して、情報を格納および取得できます。セッションは1人のユーザーに属し、すべてのユーザー間でデータを共有する手段ではありません。

紹介はこちらをご覧ください。

沈黙

session_start()が呼び出される前に何も出力してはなりません。つまり、<?phpセッションを使用したいPHPスクリプトの最初のものでなければなりません。<?phpさらに、との間にエコーステートメントやその他の出力生成関数があってはなりませんsession_start()

出力バッファリング

セッションを開始する前に本当に出力を生成する必要がある場合は、出力バッファリングを使用できます。

ノート

  • $_SESSION忘れています。ユーザー側で一定時間非アクティブになると、データは削除されます。
  • 次のエラーメッセージが表示された場合は、上記のガイドラインに違反しています。もう1つの可能性は、スクリプトにBOM(Unicodeバイトオーダーマーク)があることです。もしそうなら、それを削除します。

警告:session_start():セッションCookieを送信できません-ヘッダーはすでに送信されています(出力はで開始されました

これが発生する理由は、PHPが出力を処理する方法によるものです。PHPは、ユーザーに対して可能な限り高速に出力を取得しようとします。ただし、HTTPプロトコルは、応答のすべての出力(「本文」)の前に、「ヘッダー」と呼ばれる特定の制御データ(Cookie、ユーザーに属するセッションなど)を送信します。何かを出力するとすぐに、ヘッダーを送信する必要があります。つまり、出力バッファリングを使用しない限りです。

于 2012-07-24T14:42:02.843 に答える
3

そこにはあなたの思考パターンが見えると思いますが、あなたがやろうとしていることは多くの点で間違っています。

1.シングルトンはパターンではなく、アンチパターンです

シングルトンはアンチパターンであり、絶対に避ける必要があります。理由については、ゴードンによるこのすばらしい回答を参照してください。

2.HTTPはステートレスプロトコルです。

PHPだけで行うことは、2つのリクエスト間で状態を維持するのに役立ちません。リクエスト$shoppingCartごとにゼロから作成されます。実際、アプリケーション全体が作成されます。オブジェクトにデータを永続化しようとしないでください。代わりに、別の場所からそれぞれのデータをフェッチして、要求ごとに状態を再作成する必要があります。あなたの例では、おそらくある種のデータベースnosqlまたはsqlからのものです。

3.セッション

スーパーグローバルでユーザー固有のデータを永続化することはできます$_SESSIONが、ほとんどの場合、私はそれに反対することをお勧めします。ユーザーセッションは認証とユーザーデータを保持する必要がありますが、ビジネスロジックに関連するすべての種類のデータをそこに保存することは避けてください。

于 2012-07-24T14:49:47.323 に答える
1

PHPはアプリケーションサーバーではありません。リクエスト間で「アプリケーション」状態が自動的に保持されることはありません。$ _SESSION、Cookie、および/または独自のプライベートメソッドを介して自分でそれを行う必要があります。

データを保持するための手順を実行しない限り、スクリプトを呼び出したHTTPリクエストが終了すると、アプリケーションの状態が消去されます。

于 2012-07-24T14:41:15.313 に答える