2017-08-24 3 views
8

私は最近、PHPの動的変数の概念について紹介しました。私にとっては、プログラム内で動的変数を使うと読み込み/フォローするのが難しいようです。PHPやその他の言語で動的変数(変数変数)を使用する理由

誰でも私にメリットを説明したり、PHPの動的変数が必要な場合の本当のシンプルな現実世界の例を共有できますか?

あなたは、動的変数が何であるか、彼らは、私はそれは主観的であることに基づいて(引き込まため、投票を)この質問を閉じるために投票したthis question

+5

これらは一般的に可変変数と呼ばれています。あなたがそれらを使用しなければならないということを意味するわけではありません...一般的に、私はそれらを使用しないことを推奨します。なぜなら、いつもより良い選択肢があるからです。 –

+0

それは読みにくい。 –

+0

ここでは、変数変数の使い方を理解しようとする多くの質問に基づいて、別々の変数を作成する代わりに配列キーの名前を付ける必要があります。 –

答えて

6

をチェックアウト動作しますが、反射に、私は私ができるどのように考えるか疑問に思っている場合客観的な答えを出す。

静的変数名は、変数が表す値を識別するためのラベルとして、基礎となるエンジンが使用するトークン(非常に非常に一般的な説明)を表す一連の文字です。

"文字列"は文字列です。 A 文字列は、文字列を表す式です。だからそこから、文字列を表現する式は、変数を参照するトークンを表現するのに十分なはずであるという理由があります。その式自体を変数に割り当てることができ、そこから動的変数名を得ることができます。

これはあなたが尋ねたものではありません。あなたは質問:なぜですか?

このような質問に答えるのは、言語の実装者にとってではありません。言語を使用して、統一された予測可能なプログラミングインターフェイスを提供するのは彼らの仕事です。 の式を使って文字列を表すことができます。これは、変数で表すことができます。ジョブが完了しました。

主観的に、いくつかのデータは、外部ソースからインポートされるIは、潜在的に見ることができ、データの偶数スキーマが動的です。ある種の汎用オブジェクトのやり方でそれを表現したいと思うかもしれません、そしてそこから、オブジェクトのプロパティの名前もまた動的かもしれません。これが手元にある問題に対する優れたアプローチであるかどうかは、主観的であり、開発者の判断、コードレビュー中の同僚の判断に委ねられます。

もう1つの例は、「必要がある」必要がある場合や何らかの理由で動的ネーミングを使用すると、すばらしいスパゲッティコードを引き継いだ可能性があります。

PHPの負担がコードを書くためのメカニズムを提供するで終了します。それは前記コードの設計の質に言及していない。これがコードレビューの目的です。

+1

すばらしい答え!説明をしてくれてありがとう。素晴らしい点があります! – ScottyG

+1

これは興味深い答えを生成する場合、/が自動的に閉じない方が良い場合があります。 –

4

variable variableは、別の形態のreflectionである。基本的には、「実行時に変数がわからない場合、なぜ変数を変更したいのですか」と尋ねています。

技術的には同じではありませんが、(またはarray)とは異なる種類のvariable variableが表示されます。 variable variablesのほとんどはhash tableと書き直すことができ、驚くことはありません。しかし、実行時と実行後に変数を使用する必要がある場合は、hash tableはさらに扱いにくいかもしれません。

簡単なユースケースは、ユーザーが変更できる設定であるかもしれません。次の例は安全ではありませんが、その目的を実証しています。

<?php 
/* 
Simple way, if you have a limited amount of settings 
*/ 
$settings = array(); 
$settings["allowAccess"] = 1; 
$settings["allowModify"] = 1; 
$settings["allowDelete"] = 0; 

if ($result = $mysqli->query("SELECT `allowAccess`, `allowModify`, `allowDelete` FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    $settings["allowAccess"] = $row["allowAccess"]; 
    $settings["allowModify"] = $row["allowModify"]; 
    $settings["allowDelete"] = $row["allowDelete"]; 
} 

/* 
Now consider you have a thousand settings and you dont want to write out every setting manually. 
*/ 
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    foreach($row as $key => $val) { 
     $settings[$key] = $val; 
    } 
} 

/* 
Both options work, but everytime you want to use a setting you have to use something like below 
*/ 

if ($settings["allowAccess"] && $settings["allowModify"] && $settings["allowDelete"]) { 
    unlink($somefile); 
} 

/* 
Perhaps you would rather write 
*/ 

if ($allowAccess && $allowModify && $allowDelete) { 
    unlink($somefile); 
} 

/* 
Then you can use 
*/ 
if ($result = $mysqli->query("SELECT * FROM `user_settings` LIMIT 1")) 
{ 
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    foreach($row as $key => $val) { 
     //if you use extract, all columns are extracted, unless you drop them first. But perhaps you need those for something else. 
     //now I extract the columns that start with allow and keep the columns like id, created, modified, etc. without the need to specify each column manually, which makes it easier if you ever decide to add another setting column. You don't need to update this part of the code. 
     if (substr($key,0,5)=='allow') { 
      $$key = $val; //$key = 'allowAccess', $$key == $allowAccess = $val; 
     } 
    } 
} 
?> 

これはほんの一例ですが、私はBrion VibberXHTML sanitizer for MediaWiki内の別の例を見つけました。彼はコード内でたくさんの配列を使い、ある時点でそれらをすべて反転する必要があった。彼は以下のコードを使用:今、彼は以下のコードを書かれている可能性が明らかに

<?php 
$vars = array('htmlpairs', 'htmlsingle', 'htmlsingleonly', 'htmlnest', 'tabletags', 
       'htmllist', 'listtags', 'htmlsingleallowed', 'htmlelements'); 
foreach ($vars as $var) { 
    $$var = array_flip($$var); 
} 

?> 

を、しかし読みそれは本当に簡単ですか!また、別のユースケースを紹介

<?php         
$htmlpairs = array_flip($htmlpairs); 
$htmlsingle = array_flip($htmlsingle); 
$htmlsingleonly = array_flip($htmlsingleonly); 
$htmlnest = array_flip($htmlnest); 
$tabletags = array_flip($tabletags); 
$htmllist = array_flip($htmllist); 
$listtags = array_flip($listtags); 
$htmlsingleallowed = array_flip($htmlsingleallowed); 
$htmlelements = array_flip($htmlelements); 
?> 

:私は動的に反転した配列決定したい場合はどう? variable variableの方法では、配列にアイテムを押し込んで、その時にそれを反転させることができます。通常の方法では、 switchまたは ifをループして各オプションを手動で追加する必要があります。

+0

興味深い例。しかし、私は別の質問につながります。なぜ、配列フリップを使うのでしょうか? – ScottyG

+1

PHPの2つの文字列の部分的な類似性を比較するために[この回答](https://stackoverflow.com/a/16521079/434949)で使用しました。基本的には、配列に特定の値が含まれている場合に多くの時間をチェックする必要がある場合に使用します。一度それを反転することで、配列全体を常にループして値が入っているかどうかを調べるのではなく、 'array_key_exists'を使うことができます。しかし、この例では 'array_flip'を使っていますが、たくさんの変数を使って何かをしたいときや、それをやりたい変数を動的に割り当てるときに' variable variables'を使うことができます。 –

+0

'foreach($ row as $ key => $ val){$$ var = array_flip($$ var); } 'は簡単です' extract($ row) '? – symcbean

関連する問題