可変変数はかなりクールに思えますが、実稼働環境で実際に使用するシナリオは思いつきません。そのようなシナリオは何でしょうか?それらはどのように使用されましたか?
6 に答える
その目的は、初心者のプログラマーが複合型 (配列やオブジェクト) のような「複雑なもの」を使用せずにデータを動的に変更できるようにすることだと思います。
私は決してそれらを使用しません。
変数変数は本質的に配列(マップ/辞書)です。以下は同等のアイデアです。
<?php
$foo = array('a' => 1);
$bar = 'a';
echo $foo[$bar]."\n";
$foo_a = 1;
$bar = 'a';
$vv = "foo_$bar";
echo $$vv."\n";
?>
したがって、「変数変数」を親配列にラップすると、それらをなくすことができます。
私は人々がクラス内で変数プロパティを使用するのを見てきました:
<?php
class Foo
{
private $a = 1;
public function __get($key)
{
if (isset($this->$key)) return $this->$key;
}
}
$foo = new Foo();
echo $foo->a;
?>
ただし、ここでも、配列を使用できます。
<?php
class Foo
{
private $props = array('a' => 1);
public function __get($key)
{
if (array_key_exists($key, $this->props))
return $this->props[$key];
}
}
$foo = new Foo();
echo $foo->a;
?>
そしてクラス外:
<?php
class Foo
{
public $a = 1;
}
$foo = new Foo();
$prop = 'a';
echo $foo->{$prop};
?>
したがって、独自の制御されたコードを作成するときに、変数変数または変数プロパティを使用する必要はありません。私の個人的な好みは、変数変数を決して使用しないことです。私は時々変数プロパティを使用しますが、その方法でデータにアクセスする場合は配列を使用することを好みます。
単一のシナリオで役立つことがわかりました。このように、YouTube API の結果を JSON 形式で取得していました
$obj->media$title => Video title
だから私はそれを次のように使用しました
$mt = 'media$title';
$obj->$mt ;
だからここで私のために働いた:)
PHP ファイルを使用していて、変数を設定する必要があるテンプレート システムで使用することを考えてみてください。
function fetch_template($file, $vars){
$ret = 'File not loaded.';
if(file_exists(TEMPLATE_PATH.$file)){
//could do this with extract() but I am showing you
foreach($vars as $varName => $value){
${$varName} = $value;
}
ob_start();
include(TEMPLATE_PATH.$file);
$ret = ob_get_contents();
ob_end_clean();
}
return $ret;
}
テンプレートでこれらの変数名を使用したと仮定すると、それを呼び出して、使用するために変数を渡すことができます。
echo fetch_template('hi_there.tpl', array('name'=>'JJ'));
次に、テンプレートで:
Hello <?php echo $name; ?>!
個人的にはかなり頻繁に使っています。次のタイプの呼び出しはすべて変数-変数を使用します。
$foo->$bar = 'test';
$foo->$bar();
$bar();
したがって、動的メソッド/関数呼び出しを行うときはいつでも、変数-変数を使用しています...
__get
これの一般的な用途は、マジック メソッドを介して保護されたプロパティにアクセスすることです。私は次のことをよく見ました。
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
定義上、可変変数を使用して保護されたメンバーへの読み取りアクセスを提供しています...
私は$$var
構文を直接使用したことはありません (今後も使用するとは思いません)。name でグローバル変数にアクセスするために使用されているのを見てきましglobal $$name; echo $$name;
たが、同じことが$_GLOBALS[$name]
構文で実行できるため、それは良いユースケースではありません (グローバル変数の使用は通常悪い習慣と見なされることは言うまでもありません)...
私は主に、php ファイルの先頭にある get/post データをサニタイズする際のコピー アンド ペーストを減らすために使用します。サニタイズされた変数を適切な名前で作成します。
$fields=array('age','name','gender','email','username');
foreach($fields as $field) {
if (empty($_REQUEST[$field] === false)
${$field} = sanitize($_REQUEST[$field]);
else
${$field} = '';
}
これらすべての行の代わりに:
if (empty($_GET['age']) === false)
$age= sanitize($_GET['age']);
else
$age= '';
if (empty($_GET['name']) === false)
$name= sanitize($_GET['name']);
else
$name = '';
if (empty($_GET['gender']) === false)
$gender= sanitize($_GET['gender']);
else
$gender= '';
if (empty($_GET['email']) === false)
$email= sanitize($_GET['email']);
else
$email= '';
if (empty($_GET['username']) === false)
$username= sanitize($_GET['username']);
else
$username= '';
役立つことを願っています