2009-06-16 35 views
5

私はPHPでしばらく開発してきましたが、変数変数を使用しなければならなかったのです。誰でも私の例を教えてもらえますか?それとも、彼らは楽しいために言語に含まれていたのですか?PHPで可変変数を使用する場合

+1

として解釈される変数変数 self::$$file;を使用することができます覚えて、このような self::$file; ...何をスコープにしようとしたとき、私はこれで自分自身を交差させてきましたPHPの "可変変数"は一体ですか? –

+3

$ foo = 42; $ bar = "foo"; $ 0122 bar ==> 42 – jrockway

答えて

5

私が使用しなければならなかった状況の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 

あり、このアプローチでは外を見るために、セキュリティの落とし穴がたくさんありますが、これは私が使用することを見てきた一つの方法です可変変数。

免責事項:このコードを実際に使用することはお勧めしません。

+0

実際には、文字列を使用している場合は余分な$を省略できます。 PHPはあまりにも厄介な言語ではないと誰も言いませんでした。 :) –

+0

私はその場合に使用します。まず、すべての$ _GET、$ _POST、パケット送信データをスラッシュしてエスケープしてから使用します。 このようにして私のURLはApacheによって処理されます。 site.com/controller/$_GET[1]/$_GET[2]/$_GET[n]ので、クラス名、関数、パラメータとして使用するのはすばやく簡単です。 私は、変数またはバリアントを用語またはセキュリティで使用することについてのいくつかの注意を感謝します。文字列がどのように処理されるか、コンパイラなどの前にコードに挿入されているかのように。 $ class - > $ _ GET [1]; $ _GET [1] = 'knownFunction; mysql_query( 'DROP *'); ';等 – Supernovah

9

私は一般的にコードが悪いところでそれらを見つける。たぶん、静的な設定変数などを参照するかもしれません...しかし、なぜ通常の連想配列は良い解決策ではありませんでした。起こるのを待っているセキュリティホールのようだ。

テンプレートで効果的に使用できると思われます。

7

使用しないでください。常に「配列」が優れたソリューションです。

+1

+1はい - *任意の*データ構造が良い方法です – Dario

6

まず、これらの目的でユーザーアウトプットを使用することは大きなセキュリティ上の懸念になります。ここでは内部のみが有効です。

これを考えると、さまざまな変数をループしたり、変数をパラメータとして送信したりするためのものだと思います。

foreach($name in array('_GET','_POST','_REQUEST')) { 
    array_map('stripslashes',$$name); 
} 
+0

良い例:) –

0

あなたは(あなたは空想何もしていない場合は、する必要はありません)マルチ深度変数を使用して作業している場合を除き、あなたはおそらく、それらを必要としないでしょう。それでも、同じことを書き留めて、同じ結果を得る別の方法を見つけることはおそらく可能です。それはもっと短く(場合によっては分かりやすくても)使うことができるので、私はそれが言語の一部であることを嬉しく思います。

2

バージポールで触れてはいけない機能を言語に含めることは珍しいことではありません(私もasked a question about itです)、変数変数はおそらくこのカテゴリに該当する構造体の1つです。言語に機能が含まれているという理由だけで、その機能を使用する必要はありません。

問題を解決する場合があります(すべての再帰が実際にはほとんど使用されていないが、それは本質的な構成ではないと主張する人は誰もいないでしょう)が、一般に、コードが行っていることを隠す言語機能、変数は挑戦的にこのカテゴリに分類され、非常に注意深く扱われるべきである。

0

私は変数変数には多くの用途は見つかっていませんが、あなたがやっていることが明らかである限り、メソッドの変数を使うことは便利です。シンプルなRESTサービスではたとえば、あなたがこのような何かを行う可能性があります:あなたが判断した場合(

$method = $request->getMethod(); // 'post','get','put','delete' 
try 
{ 
    $response = $resource->$method($request->getInput()); 
} 
catch (BadMethodException $badMethod) 
{ 
    $response = $responseFactory->getError($badMethod); 
} 

は、いくつかは、あなたが(これはあなたができる)switch文でも同等にこれを行うことができます主張するだろうが、この方法は拡張性に適しています別のメソッド型を追加する)、リソースへのメソッド適用の抽象を維持します。私はかなり良いものを見つけた

2

は...

$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

静的変数その後、私は私がたまにしかPHPを使用self::$php;

関連する問題