私はテストのための簡単なロジックを書いています。アクションメソッドが呼び出されると、そのアクションにパラメータとして渡された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#で同様のコードを書いたが、期待どおりに機能した。
なぜMemcacheの(独立したメモリベースの記憶媒体)、Redisの(同上)、APCu(モジュールとしてPHPに組み込むことができます)のようなものが含まれますあなたは引用符ですべてをラッピングしていますか? '' {$ id} ''を使わず、' $ id'を使ってください。もっと読みやすくなります。また、キーワード 'static'を現在のクラス名の代わりに使用することもできます。これにより、後でリファクタリングが非常に簡単になります。 – Devon
@Devon:潜在的にハイジャックして申し訳ありませんが、「自己」の使用も容認できますか? – Kisaragi
@Kisaragi、はい、それは異なります。時には自己が良いです。クラスが拡張されるときは、これは異なる方法で適用されます。例:Controllerのselfは常にControllerを参照します。コントローラ内のstaticは、機能を拡張できるように呼び出されるクラス(UsersController)を参照します。 – Devon