web-dev-qa-db-ja.com

PHPの静的変数はリクエスト間で存続しますか?

PHPの静的変数の落とし穴

私はJavaバックグラウンドで、最近1つのプロジェクトでphpに切り替えました。phpで予期しない動作が1つ見つかりました。

静的変数に設定された値は全体で永続的ではありませんリクエスト。

これが予想される動作であるかどうかはわかりません。 Java)では、非常に一般的に使用される変数を保持したり、リクエスト全体でdbname、hostname、username、passwordなどの定数を指定したりできるため、ローカルプロパティファイルから常に読み取る必要はありません。 。

この動作は正常ですか?そして、それが正常である場合、リクエスト間で変数に割り当てられた値を永続化できる代替手段はありますか?

誰かがPHPでこれを行うためのより良い方法を私に提案できますか?

35
Vaibhav Kamble

いいえ、静的変数は現在のリクエストに残りますが、リクエスト間でその値を保持するには、静的変数をセッションに追加する必要があります。

例:

session_start();

class Car {
    public static $make;
    public function __construct($make) {
        self::$make = $make;
    }
}

$c = new Car('Bugatti');
echo '<p>' . Car::$make . '</p>';
unset($c);

if (!isset($_SESSION['make'])) {
    echo '<p>' . Car::$make . '</p>';
    $c = new Car('Ferrari');
    echo '<p>' . Car::$make . '</p>';
}

$_SESSION['make'] = Car::$make;

echo '<p>' . $_SESSION['make'] . '</p>';
22
Ross

静的変数は、1つのリクエストにのみ適用できます。特定のユーザーのリクエスト間でデータを保持する場合は、セッション変数のみを使用してください。

それらのための良いスターターツットはここにあります: http://www.tizag.com/phpT/phpsessions.php

3
Matt Razza

セッション間で複雑なデータセットの操作を開始する場合は、データベースにシリアル化され、セッションの復元時に引き出されるオブジェクトにデータを格納することを検討することをお勧めします。

PHPの変数は永続的であることを意味しません。アプリケーション(スタック)のフローは、ページが実行されるたびに最初から最後まで実行されます。ロジックを継続するバックグラウンドには何もありません。またはアプリケーション。最も近いのはセッションですが、dbアクセスなどの情報をそこに保存したくありません。

データベース構成は、データベースに接続するために一度アクセスされるある種の構成ファイルまたは環境ファイルに含まれている必要があります。接続が確立されると、必要なときにいつでもクエリを実行し、接続ハンドルを使用して使用する接続を特定できます。

2
Syntax