2017-09-06 13 views
-1

私はテストのための簡単なロジックを書いています。アクションメソッドが呼び出されると、そのアクションにパラメータとして渡されたIDを取得し、それを連想配列に格納します。私はロジックを扱う静的関数を書いた。私は2番目の問題も持っている、私はIDが連想配列のキーとして既に存在するかどうかをチェックしたい、そうであれば、カウンタをインクリメントしたい。しかし、私はその問題の別の質問を開くことができます。この質問の目的は静的変数が機能しないことです。関数内でPHP静的クラス変数を扱う方法

class UsersController extends Controller 

static $users= Array(); 

public function show($id) 
    { 
     $this::stats($id); 
    } 

private static function stats($id) 
    { 

     if( array_key_exists("{$id}", UsersController::$users)) 
     { 
      UsersController::$users["{$id}"] += 1; 
     } 
     else 
     { 
      UsersController::$users["{$id}"] = 1; 
     } 
    print_r(UsersController::$users); 
    } 

毎回、別のユーザーwww.example.com/users/2またはwww.example.com/users/1にアクセスします。 print_rステートメントは配列内に1つの要素しか存在しないことを示します。私はいくつかのoopの原理が欠けていますか?私はC#で同様のコードを書いたが、期待どおりに機能した。

+0

なぜMemcacheの(独立したメモリベースの記憶媒体)、Redisの(同上)、APCu(モジュールとしてPHPに組み込むことができます)のようなものが含まれますあなたは引用符ですべてをラッピングしていますか? '' {$ id} ''を使わず、' $ id'を使ってください。もっと読みやすくなります。また、キーワード 'static'を現在のクラス名の代わりに使用することもできます。これにより、後でリファクタリングが非常に簡単になります。 – Devon

+0

@Devon:潜在的にハイジャックして申し訳ありませんが、「自己」の使用も容認できますか? – Kisaragi

+1

@Kisaragi、はい、それは異なります。時には自己が良いです。クラスが拡張されるときは、これは異なる方法で適用されます。例:Controllerのselfは常にControllerを参照します。コントローラ内のstaticは、機能を拡張できるように呼び出されるクラス(UsersController)を参照します。 – Devon

答えて

0

あなたはOOPの原則を見落としているわけではなく、PHPプロセスの標準実装が欠落しています。通常、Webサーバーはphpスクリプトを実行してから実行するように設計されています。 2つの異なるページにアクセスすると、メモリに永続性はありません。

PHPを実装して同じメモリを使用し続けることはできますか?確かに可能ですが、私が知っているWebサーバーの実装はこのようには動作しません。

ほとんどの人は、セッション(サーバー側)またはクッキー(クライアント側)を使用して、複数の要求にわたって永続データを保持します。

+0

はい、私の問題は要求の処理方法です。 –

-1

複数の要求によって永続するには、データを永続的なストレージに保存する必要があります。

各PHPリクエストは全く新しい実行です。 C#コードであれば、C#プログラムを終了してもう一度起動し、2番目のユーザーと一緒に訪れたようになります。

失われ、あなたが保存できる場合は、このデータのストレージは大したユーザーごとではなくすることができた場合は多くの場合、PHPとの永続的なストレージの使用ソースは、ファイルに保存するようなオプション、データベースなど

が含まれます(サーバーに保存された、通常はファイルに保存された)セッションまたはクッキー(クライアントのブラウザーに保存されたセッション)に保存されます。これらの記憶媒体はいずれも信頼性が高く一時的ではないと考えられている。

は、データストレージの一層の一時的な形式があり、彼らはなど、

関連する問題