10

私はグローバル変数が本当に嫌いです - おそらくそれは私の中のC#プログラマーですが、PHPで作業しているときは、次のようなことをしなければならないたびに歯を食いしばります:

$strUsername = $_GET['username'];

はい、私はそれを非常に単純化しすぎており、はいはい、これらすべてを適切にサニタイズしています。実際、私が構築したフレームワークでは、すべてのスーパーグローバルがほぼ実行の開始時に取得され、そこから依存性が注入されます。

私は PHP マニュアルでこの関数に出くわしました (本当に毎日何か新しいことを学んでいます): filter_input_array()。

したがって、技術的には、GET スーパーグローバルからすべてを取得する代わりに、次のようにすることができます。

$GETdata = filter_input_array(INPUT_GET);

....など、POST、REQUESTなどの他のものと同様です。私の質問は、filter_input_arrayを使用してスーパーグローバルの惨劇を回避する必要があるか、またはそれらに固執してfilter_input 関数? これに関する他のみんなの経験は何ですか?

編集: 1 つ忘れていました。filter_input 関数は、スーパーグローバルに対して行うスクリプト レベルの変更を認識していないため、後で$_GET['cheese'] = 'puff';実行しようとするfilter_input(INPUT_GET, 'cheese');と null が返されます。私はすべてを依存性注入するので、これは問題ありませんが、気付いていない場合、後で不意を突かれる可能性があります。

4

7 に答える 7

9

filter_input_array を使用すると、まだスーパーグローバル配列の 1 つからデータを取得しているため、引き続きスーパーグローバルが使用されます。

これらの配列のいずれかからデータを取得することに問題はありません。実際にデータを取得する唯一の方法です。使用しているものが何であれ、必ずエスケープする必要があります。

html の htmlentities、pdo の準備済み文字列、mysql_ 関数の mysql_real_escape_String など...

于 2011-04-14T15:45:54.890 に答える
5

グローバル変数が悪いのはなぜですか?

一般的な議論は、外部状態に不要な依存関係を導入するためです。

あなたのソリューションはそれを防ぎません。それを隠すだけです。

より良い解決策は、次のように $_GET を引数として提供することです。

function myController($get) {
   $user = Model::get_user($get['userid']);
   render_view('user.html', $user);
}

myController($_GET)

これは、グローバル変数が悪いと見なされる理由に対処するためです。

于 2011-04-14T15:45:46.107 に答える
3

私は PHP スーパーグローバルを使用していますが、フレームワークのライブラリ レベルでのみ使用しています。これは、すべてのコントローラーがリクエスト オブジェクトにアクセスできるフレームワークであり、リクエスト オブジェクトはスーパーグローバルにアクセスします。これにより、テスト パラメーターを設定したモック リクエスト オブジェクトを作成して、コントローラーのテストを作成できます。優れた OO 設計と優れた設計パターンがすべてです。

抽象化を行わずにどこでもスーパーグローバルに直接アクセスすることは、アンチパターンです。

于 2011-04-14T15:48:17.137 に答える
1

スーパーグローバルが本当に嫌いなら、ここで vB_Input_Cleaner クラスのようなクリーニング用の独自の実装を作成してみませんか?

http://members.vbulletin.com/api/

于 2011-04-14T15:53:17.783 に答える
1

私は誰かが完璧な答えを知っているとは思わない:)

使用することもあれば、 と同じよう$_GET['data']にデータを取得することもあれば、 を使用することもありますimport_request_variables()

一部のプロジェクトでは、特別なクラスがあり、そのプロセス、、、POSTおよび次のようなことを行いますGET:またはまたは...REQUESTPOST::getValue('username')GET::getValue('session_id')COOKIE::getValue('last_time_seen')

于 2011-04-14T15:48:46.750 に答える
1

私はそれらのグローバル変数も本当に嫌いです。私は間違いなくfilter_input_array、必要に応じて配列を使用します。これにより、多くのグローバル関連のバグが解決され、これらの見つけにくいグローバルのデバッグに何時間も費やす必要がなくなります。

filter_input_arrayそれがwtgだと思います!

于 2011-04-14T15:45:14.240 に答える
0

数年前には、URL のパラメーター &x= がグローバル $x として表示され、さらに悪化しました。Amyway、フレームワーク以外で $_GET を使用しない場合、存在しません。

于 2011-04-14T18:42:56.040 に答える