web-dev-qa-db-ja.com

PHP 5.4以降でregister_globalsをエミュレートするにはどうすればよいですか?

私はregister_globalsを使用するフレームワークに取り組んでいます。私のローカルphpバージョンは5.4です。

PHP 5.3.0からregister_globalsが廃止され、PHP 5.4で削除されることはわかっていますが、このコードをPHP 5.4で動作させる必要があります。

PHPの新しいバージョンの機能をエミュレートする方法はありますか?

14
LX7

グローバルで extract を使用してregister_globalsをエミュレートできます scope

extract($_REQUEST);

または、グローバルと 変数変数 を使用して独立した関数に配置します

function globaling()
{
    foreach ($_REQUEST as $key => $val)
    {
        global ${$key};
        ${$key} = $val;
    }
}

リリースされたアプリケーションがあり、その中で何も変更したくない場合は、globals.phpファイルを

<?php
extract($_REQUEST);

次に auto_prepend_file ディレクティブを.htaccess(またはphp.ini)に追加します

php_value auto_prepend_file ./globals.php

この後、コードはすべての呼び出しで実行され、アプリケーションは古い設定が有効であるかのように動作します。

25
sectus

参考になるかもしれませんが、これはphp.netでregister_globals Onをエミュレートするために推奨されているコードです。

<?php
// Emulate register_globals on
if (!ini_get('register_globals')) {
    $superglobals = array($_SERVER, $_ENV,
        $_FILES, $_COOKIE, $_POST, $_GET);
    if (isset($_SESSION)) {
        array_unshift($superglobals, $_SESSION);
    }
    foreach ($superglobals as $superglobal) {
        extract($superglobal, EXTR_SKIP);
    }
}

ソース: http://php.net/manual/en/faq.misc.php#faq.misc.registerglobals

7
Ernesto Allely

PHPマニュアル によると、

この機能はPHP 5.3.0で廃止され、PHP 5.4.0。で削除されました。

ただし、Google検索により、この方法が buntuフォーラム で明らかになりました。

いいえ、ようやく完全に使用できなくなりました。まだグローバルを使用しているサイトは何ですか、コードを修正するために今から半年以上です。

最も簡単な解決策は、アプリの最初でこのコードを実行して、グローバルを最初から作成することです。

コード:

foreach ($_REQUEST as $key=>$val) {
    ${$key}=$val;
}

この方法で作成された変数は、スクリプトの残りの部分でまだ定義されていないことに注意する必要があります。

.htaccessファイルのauto_prepend_fileディレクティブを使用して、このコードをサイトのすべてのページの前に強制的に実行できます。

register_globalsを必要とするコードを確認し、無効にして適切に動作するように変更することを強くお勧めします。

5

以前のphp.iniで:

auto_globals_jit = On

後:

auto_globals_jit = Off
0
user3081809