web-dev-qa-db-ja.com

session_register()の非推奨の問題を修正する方法は?

PHP 5.3のsession_register()非推奨の問題を修正する方法

42
DEVOPS

使用しないでください。説明は言う:

現在のセッションに1つ以上のグローバル変数を登録します。

私の頭に浮かんだ2つのこと:

  1. とにかくグローバル変数を使用するのは良くありません。それらを回避する方法を見つけてください。
  2. _$_SESSION['var'] = "value"_で変数を設定できます。

manual からの警告も参照してください。

_register_globals_に関係なくスクリプトを機能させる場合は、_$_SESSION_エントリが自動的に登録されるため、代わりに_$_SESSION_配列を使用する必要があります。スクリプトがsession_register()を使用する場合、PHPディレクティブ_register_globals_が無効になっている環境では動作しませんnot]。

_register_globals_ディレクティブ デフォルトでFalseに設定されています!

さらに:

これにより、global変数が登録されます。 function内からセッション変数を登録する場合は、globalキーワードまたは_$GLOBALS[]_配列を使用して、それをグローバルにする必要があります。または、下記の特別なセッション配列を使用します。

そして

_$_SESSION_(または_$HTTP_SESSION_VARS_)を使用している場合は、session_register()session_is_registered()、およびsession_unregister()を使用しないでください。

43
Felix Kling

変数を設定するには、$_SESSIONを直接使用します。このように:

$_SESSION['name'] = 'stack';

代わりに:

$name = 'stack';
session_register("name");

詳細はこちら

24
shamittomar

before PHP 5.3

session_register("name");

since PHP 5.3

$_SESSION['name'] = $name;
18
Serhii Koval

フォールバック関数が必要な場合は、これを使用できます

function session_register($name){
    global $$name;
    $_SESSION[$name] = $$name;
    $$name = &$_SESSION[$name]; 
}
10
wutzebaer

Felix Kling の答えを補完するために、私は次のコードを持つコードベースを研究していました。

if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        session_register($var);
    }
} else if (!(empty($start_vars))) {
    session_register($start_vars);
}

Session_registerを使用しないために、次の調整を行いました。

if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        $_SESSION[$var] =  $GLOBALS[$var];
    }
} else if (!(empty($start_vars))) {
    $_SESSION[$start_vars] =  $GLOBALS[$start_vars];
}
0
Pedro Pinheiro