PHP 5.3 Strange '$ {}'コードのサポート?
質問
私はPHP 5.3にアップグレードしたばかりで、新しいクライアントのために古いウェブサイトをサポートし始めました。これまでに出会ったことのないかなり奇妙なPHPコードを使用しているようです。
$ _getまたは$ _request変数にアクセスしようとしている間、開発者は以下を使用しました。 $ {"variable_name"}
未定義の変数のために生成された通知を受け取ります(おそらくPHPが解析していないため $ {"variable_name"} スタイルコード)。
これを変更します $ _Request ['variable_name' 予想どおりに機能しますが、すべてのコードを実行することはできません。サイトは巨大であり、独自のレイアウト方法を使用しているため、変更することはできません。
これらのタグ /コードブロックのサポートをオンにすることが可能かどうか誰もが知っていますか?私はphp.iniを見てみましたが、ASPスタイルのタグと短いタグについて言及していますが、これらを有効にすることは効果がありません(とにかくまったく違うように見えますが、ショットの価値があると思いました)。
解決
その構文には新しいものがないと思います:
$a = 10;
var_dump(${"a"});
うまくいきます;-)
あなたの問題は、おそらく以前に、 register_globals
有効になりました (デフォルトでは、php <= 4.something)の場合), 、そして現在無効になっています - そしてそれはセキュリティに良いです!
register_globalsがオンに設定されている場合、任意の変数があります $_REQUEST
アプリケーションで自動化可能なものとして自動的に注入されます - まあ、実際、これはに依存します variables_order
構成オプションですが、これはほとんど常にGet、Post、およびCookieが含まれます。
たとえば、変数がある場合 $_GET['my_var']
, 、あなたも持っています $my_var
変数...そしてこれは構文でもアクセスすることができます ${'my_var'}
検討してください register_globals
は Off
デフォルトではPHP 4.2のようなものから、PHP 6で消えるはずです (私が正しく覚えていれば), 、私はそれを再活性化することを勧めます...少なくとも、あなたがコードを修正 /テストするために必要な時間があるなら...
他のヒント
変数用のカーリーブレース構文は、PHPの埋め込み部分であり、しばらくの間存在しています。それが存在する理由は、使用するときに配列とオブジェクトの構文であいまいさを解決することです 変数変数.
マニュアルから:
配列付きの変数変数を使用するには、あいまいさの問題を解決する必要があります。つまり、$$ aを書いた場合です1 その後、パーサーはあなたが$ aを使用することを意図したかどうかを知る必要があります1 変数として、またはあなたが$$ aが変数として、そして 1 その変数からのインデックス。この曖昧さを解決するための構文は次のとおりです。$ {$ a1}最初のケースと$ {$ a}の場合1 2番目の場合。
いくつかの状況では、アレイやオブジェクト変数を使用して何かを出力するなど、いくつかの状況で非常に便利な構文です。 Heredoc構文.
私は他の人が使用することについてアドバイスを繰り返しません register_globals
, 、この珍しい構文について説明したかっただけです。
$ {"variable_name"}構文は、curlyブレースの内容が最初に評価されることを除いて、$ variable_nameと実際に同じです。これは、最近のすべてのバージョンのPHP、さらにはベータバージョンによってサポートされています。ただし、最近のバージョンのPHPでサポートされていないのは、グローバル変数として$ _Request(およびその他の)変数を登録することのサポートです。それを有効にするための設定があります:
register_globals = on
ただし、セキュリティの問題のため、生産の使用には推奨されません。いくつかの「SED」のようなツールを使用してソースを実行し、使用法を正規表現に置き換える方が簡単かもしれません。
古いサーバーにはおそらくあります REGISTER_GLOBALS
の上。したがって、奇妙なブラケットは問題ではありません。
REGISTER_GLOBALS
すべての変数を入れます $_REQUEST
グローバル範囲の通常の変数として、つまり、アクセスできることを意味します $_REQUEST['test']
のようにアクセスできます $test
また ${"test"}
ブラケット構文はデフォルトでオンになっていますが、オン/オフにできるとは思いません。
register_globals
おそらくオンになっていた。 {$variable_name}
構文は常にオンですが register_globals
のようなものを回します $_REQUEST['variable_name']
の中へ $variable_name
.
ただし、可能な場合はオンにしないでください。それが長い間アドバイスされてきた理由があり、PHP6で完全に消えています。
register_globals
PHP 5.3の時点で非推奨され、PHP 6.0の時点で除去されます。あなたがしたいのは、ほとんどのPHP IDE(Zendo Studio 6+)にあるリファクタリング機能を使用して、変数をより適切なものに変更することです。 $_GET['variable_name']
.