私はしばらくの間 PHP で開発を行ってきましたが、変数変数を使用しなければならないタスクはまだありません。それらを使用することが良い考えである例を誰か教えてもらえますか? それとも、楽しみのために言語に含まれていたのでしょうか?
8 に答える
私は通常、コードが悪臭を放つ場所でそれらを見つけます。静的構成変数などを参照している可能性があります...しかし、通常の連想配列がより良い解決策ではないのはなぜですか。セキュリティホールが発生するのを待っているようです。
テンプレートで効果的に使用できると思います。
それらを使用しないでください。「配列」は常により良い解決策です。
まず、これらの目的でユーザー出力を使用すると、セキュリティ上の大きな問題になります。ここで有効な用途は内部構造のみです。
それを考えると、さまざまな変数をループしたり、変数をパラメーターとして送信したりするためのものだと思います。
foreach($name in array('_GET','_POST','_REQUEST')) {
array_map('stripslashes',$$name);
}
私がそれらを使用しなければならなかった状況の 1 つは URI 処理です。ただし、この手法は時代遅れかもしれませんが、確かに長い間使用していませんでした。
形式でスクリプトから URI を取得したいとしましょうdomain.tld/controller/action/parameter/s
。次を使用してスクリプト名を削除できます。
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
これからコントローラー、アクション、およびパラメーター値を抽出するには、パス区切り文字「/」を使用して文字列を分解する必要があります。ただし、先頭または末尾に区切り文字がある場合は、爆発時に配列値が空になるため、文字列の最初と最後からそれらを削除する必要があります。
$uri_string = trim($uri_string, '/');
パスを配列に分解できるようになりました。
$uri_data = explode('/', $uri_string);
$uri_data[0]
コントローラー名、$uri_data[1]
アクション名、およびそれ以降の配列内の値が含まれるようになりました。これは、アクション メソッドに渡す必要があるパラメーターです。
$controller_name = $uri_data[0];
$action_name = $uri_data[1];
これらの名前を取得したので、さまざまなことに使用できます。コントローラーをサイト ルートに相対的な特定のディレクトリに保持する場合は、この情報をrequire_once
コントローラー クラスに使用できます。その時点で、それをインスタンス化し、変数変数を使用して呼び出すことができます。
$controller = new $controller_name();
$controller->{$action_name}(); // Or pass parameters if they exist
このアプローチには注意すべきセキュリティの問題がたくさんありますが、これは私が見た可変変数の使用方法の 1 つです。
免責事項: このコードを実際に使用することをお勧めしているわけではありません。
かなり良いものを見つけました..
$php = "templates/php/default.php";
$html = "templates/html/default.php";
$css = "templates/css/default.php";
$js = "templates/js/default.php";
今、私はユーザーに、phpまたは/およびhtmlが必要なファイルを言うように依頼しました..
$userarray = array("php", "css");
foreach($userarray as $file){
var_dump($$file);
}
出力:
テンプレート/php/default.php
テンプレート/css/default.php
このように静的変数のスコープを設定しようとしたときに、私はこれと交差しました。
その後、次のように解釈されるself::$file;
変数変数を使用できることを思い出し
ました。self::$$file;
self::$php;
バージポールに触れてはならない機能が言語に含まれていることは珍しくありません (私は少し前にそれについて質問しました)。変数変数は、おそらくこのカテゴリに分類される構成要素の 1 つです。言語に機能が含まれているからといって、それを使用する必要があるとは限りません。
それらが問題を解決する場合があります (再帰は実際にはめったに使用されませんが、それが本質的な構造ではないと主張する人は誰もいません) が、一般的に、コードが何をしているかを覆い隠し、変数変数が反抗的に陥る言語機能はすべて、このカテゴリは、細心の注意を払って扱う必要があります。
マルチデプス変数を扱っていない限り (特別なことをしていない場合は必要ありません)、おそらくそれらは必要ありません。それでも、同じことを書き留めて同じ結果を得る別の方法をおそらく見つけることができます。ただし、それらを使用すると短くなる可能性があります(場合によってはさらに理解しやすい場合もあります)。そのため、それが言語の一部であることを嬉しく思います.
可変変数の使用法はあまり見つかりませんでしたが、何をしているのかが明確である限り、メソッドに変数を使用すると便利です。たとえば、単純な REST サービスでは、次のようにすることができます。
$method = $request->getMethod(); // 'post','get','put','delete'
try
{
$response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
$response = $responseFactory->getError($badMethod);
}
ステートメントを使用してこれを同様にうまく行うことができると主張する人もいswitch
ますが (それは可能です)、この方法は拡張性に役立ち (別のメソッド タイプを追加することにした場合)、リソースにメソッドを適用する抽象化を維持します。