変数変数の良いユースケースはありますか?


8

今日、私変数変数と呼ばれるこの小さなPHP gem に遭遇しました

$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"

この言語機能の実際のユースケースは実際にありますか?


1
最も「曖昧なトリック」の実際の使用例は非常に限られているように、ある通常、これらのユースケースを実装するためにも非常にクリーンの方法であれば、ユースケースは完全にトリックに一致し、それを維持するのは難しいだろう。
Joachim Sauer

1
@JoachimSauerはっきりとはわかりませんが、変数変数はforeachループの中心にあります。
yannis

回答:


15

のURLを想定しhttp://example.com/hello/world、次のようにします.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?/$1 [L]

router.phpは、非常に単純化されたルーターです。

<?php

$request = explode("/", $_SERVER["REQUEST_URI"]);

$controllerClass = $request[0];
$controllerActionMethod = $request[1];

$controller = new $controllerClass();
$controller->$controllerActionMethod(); // hello::world();

?>

これは、変数変数のかなり標準的な実用的な使用法です。きちんとしたトリックですが、使用するときは十分に注意してください。過度に使用すると、確実にメンテナンス不可能なコードになります。

免責事項:回答に示されているコードは、機能の使用法を説明することのみを目的としています。適切な設計、セキュリティ、保守性、または健全性についてはカバーしていません。使ってはいけません。


9
免責事項:回答に示されているコードは、機能の使用方法を説明することのみを目的としています。品質に関しては、それは絶対にがらくたです。使用しないでください。
yannis

(PHP初心者向け)変数変数を正確にどこで使用したかわかりません。1ドルしか表示されません。私はそれがに関係しているの.htaccessではないかと思いますが、私もそれらをよく理解していません。
Manishearth 2012年

3
@YannisRizos-あなたの例は、変数変数ではなく、変数メソッド名を使用しています。まったく違います。リフレクションによる変数ではなく、リフレクションを介して効果的にメソッドを呼び出しています。
ジョンノ2012年

1
@Jonnoへえ、私は誰かが最初に変数変数を私に説明したときとまったく同じと思いました;)ただし、最初の「変数」は、(2番目の)変数(構造)の動的な性質を指し、そのメソッドは動的に参照されます。そしてそれはそれについてです。$controller 変数(構造)ですが、保持するものは動的に設定されるため、変数変数になります。ちょっとばかげた名前ですね。
yannis

1
@YannisRizos-私は敬意を払いません。変数変数は、正確に作成されたコードのスコープで作成された変数です。ここでは、名前を変数で定義しているメソッドを呼び出しています。そのロジックにより、「変数」を使用して次のようなことを実行します...「変数」は変数変数です。
ジョンノ

8

正直なところ?PHPの10年近くの経験で、変数変数を使用することが唯一の解決策(または選択からの最良の解決策)である問題に遭遇したことはありません。$classInstance::CLASS_CONSTANT(PHP 5.3以降で利用可能)などのクラスのインスタンスの定数にアクセスでき、それでも通常はあまり使用していません。

PHPに存在する多くのいぼのうちの1つで、当時は良いアイデアのように思われました。

だからあなたの質問に答えて、それが特定の問題への最善または唯一のアプローチであるユースケースがある場合、私はそれらを見たことはありません。


ここでも同じです-7年間私はPHPを使って作業をしていましたが、(とにかく製品コードで)vvに遭遇したことはありません。
miku

変数変数は巧妙なトリックのように見えるかもしれませんが、コードをアップグレードまたは保守しようとすると、恐ろしくあなた(または他の誰か)に噛み付きます。変数変数とグローバルスコープを組み合わせると、変数の名前を変更するだけでコードが失敗するという災害が発生します。これは、HHVMのJITコンパイラーがコードを改善できないことも意味します。
プログラム

2

変数変数の良いユースケースはありますか?

それはあなたの「良い」の定義に依存します。
私の個人的な答えは単にノーです。

私はこの質問に答えるためだけに1つを考え出そうとしました、私は人々がそれらを使用しているSOでヘルプ質問を掻き集めて、ガイドとブログ投稿を読みました。

変数変数を使用して別のアプローチよりも有用または価値があると主張できるシナリオが見つからないだけです

私が考えることができるすべてとそれらの使用に対する理由がどこにあるかを見つけました。

私は感謝の気持ちと前向きなコメントが付いた記事を1つ読んだだけで、switch文を簡単に作成する方法を論じていました。
ステートメントの切り替え、「より単純」?


私は、PHPを初めて使う人でも、配列は最初は少し難しいかもしれませんが、学習変数は、変数変数内で変数変数を使用し始めると、変数変数の学習曲線をはるかに下回ると思います。コード。

変数変数のフローを追跡して制御しようとすると、まもなく混乱します。
かつて学習した配列は、見て、使用するのが非常に簡単です。


私がそれらを見ると、彼らは:

  • 別のオプションが少なくとも同等に適していない、通常はより良い問題を決して解決しない
  • 個別のデータを持つ個別の変数ではなく、緊密に結合された「リンクされた」変数が存在するため、コードベースの管理が困難になります。
  • まれにしか使用されないため、不慣れなため、可読性はおそらく低下します。特に、余分な$($ var-> * $ * rogueVar)が欠落していると一時的に問題となるクラス/メソッドでは
  • 子変数の情報は、親なしでは利用できません。$var = "james";varの名前と値はそこにあります。
  • 要約すら不気味に聞こえる-「 別の変数の値に基づいて名前が付けられた変数」

PHPマニュアルでさえ、意図的ではありませんが、変数変数が複雑で潜在的に「厄介」であることを示す情報があります。

PHP.netが書いた:

配列で変数変数を使用するには、あいまいさの問題を解決する必要があります。つまり、$$ a [1]と記述した場合、パーサーは$ a [1]を変数として使用するつもりだったか、または$$ a [1]を変数として使用して[1]インデックスを作成するかを知る必要があります。その変数。このあいまいさを解決するための構文は、最初のケースでは$ {$ a [1]}、2番目のケースでは$ {$ a} [1]です。

それらの使用法は非常に一般的ではないので、熟練した開発者でさえ、別の開発者がコードでこれを使用した場合、突然いくらかの学習曲線が生じると主張します。

変数変数は、関数またはクラスメソッド内でPHPのスーパーグローバル配列とともに使用できません。
これはより多くの学習であり、変数変数を使用することで生じる問題を回避するための注意深い検討です。

利益なし。


「恐竜」がデータセンターを歩き回った昔は、かなり便利だったと思います。また、PHPは配列などの機能を使用して大幅にリファクタリングされていなかったため、


可変変数が私たちにいくつかの深遠な機能を与えた場合、または非常に有用な場合でさえ、おそらくそれらを使用することは学ぶ価値があります。

ただし、それらが提供するものを考えると、コードの保守性、読みやすさ、健全性の維持、および機能の違いをなくすために、配列が過剰で数マイクロ秒以上使用されたとしても、それらを使用することのポイントはわかりません。別の方法を使用する-毎回。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.