今日、私は変数変数と呼ばれるこの小さなPHP gem に遭遇しました。
$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"
この言語機能の実際のユースケースは実際にありますか?
今日、私は変数変数と呼ばれるこの小さなPHP gem に遭遇しました。
$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"
この言語機能の実際のユースケースは実際にありますか?
回答:
の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();
?>
これは、変数変数のかなり標準的な実用的な使用法です。きちんとしたトリックですが、使用するときは十分に注意してください。過度に使用すると、確実にメンテナンス不可能なコードになります。
免責事項:回答に示されているコードは、機能の使用法を説明することのみを目的としています。適切な設計、セキュリティ、保守性、または健全性についてはカバーしていません。使ってはいけません。
.htaccess
ではないかと思いますが、私もそれらをよく理解していません。
$controller
は変数(構造)ですが、保持するものは動的に設定されるため、変数変数になります。ちょっとばかげた名前ですね。
正直なところ?PHPの10年近くの経験で、変数変数を使用することが唯一の解決策(または選択からの最良の解決策)である問題に遭遇したことはありません。$classInstance::CLASS_CONSTANT
(PHP 5.3以降で利用可能)などのクラスのインスタンスの定数にアクセスでき、それでも通常はあまり使用していません。
PHPに存在する多くのいぼのうちの1つで、当時は良いアイデアのように思われました。
だからあなたの質問に答えて、それが特定の問題への最善または唯一のアプローチであるユースケースがある場合、私はそれらを見たことはありません。
変数変数の良いユースケースはありますか?
それはあなたの「良い」の定義に依存します。
私の個人的な答えは単にノーです。
私はこの質問に答えるためだけに1つを考え出そうとしました、私は人々がそれらを使用しているSOでヘルプ質問を掻き集めて、ガイドとブログ投稿を読みました。
変数変数を使用して別のアプローチよりも有用または価値があると主張できるシナリオが見つからないだけです。
私が考えることができるすべてとそれらの使用に対する理由がどこにあるかを見つけました。
私は感謝の気持ちと前向きなコメントが付いた記事を1つ読んだだけで、switch文を簡単に作成する方法を論じていました。
ステートメントの切り替え、「より単純」?
私は、PHPを初めて使う人でも、配列は最初は少し難しいかもしれませんが、学習変数は、変数変数内で変数変数を使用し始めると、変数変数の学習曲線をはるかに下回ると思います。コード。
変数変数のフローを追跡して制御しようとすると、まもなく混乱します。
かつて学習した配列は、見て、使用するのが非常に簡単です。
私がそれらを見ると、彼らは:
$var = "james";
varの名前と値はそこにあります。PHPマニュアルでさえ、意図的ではありませんが、変数変数が複雑で潜在的に「厄介」であることを示す情報があります。
PHP.netが書いた:
配列で変数変数を使用するには、あいまいさの問題を解決する必要があります。つまり、$$ a [1]と記述した場合、パーサーは$ a [1]を変数として使用するつもりだったか、または$$ a [1]を変数として使用して[1]インデックスを作成するかを知る必要があります。その変数。このあいまいさを解決するための構文は、最初のケースでは$ {$ a [1]}、2番目のケースでは$ {$ a} [1]です。
それらの使用法は非常に一般的ではないので、熟練した開発者でさえ、別の開発者がコードでこれを使用した場合、突然いくらかの学習曲線が生じると主張します。
変数変数は、関数またはクラスメソッド内でPHPのスーパーグローバル配列とともに使用できません。
これはより多くの学習であり、変数変数を使用することで生じる問題を回避するための注意深い検討です。
利益なし。
「恐竜」がデータセンターを歩き回った昔は、かなり便利だったと思います。また、PHPは配列などの機能を使用して大幅にリファクタリングされていなかったため、
可変変数が私たちにいくつかの深遠な機能を与えた場合、または非常に有用な場合でさえ、おそらくそれらを使用することは学ぶ価値があります。
ただし、それらが提供するものを考えると、コードの保守性、読みやすさ、健全性の維持、および機能の違いをなくすために、配列が過剰で数マイクロ秒以上使用されたとしても、それらを使用することのポイントはわかりません。別の方法を使用する-毎回。