可变变量看起来很酷,但我不认为这样一个场景,一个实际上在生产环境中使用它们。 什么会这样的情况呢? 它们是如何使用的?
Answer 1:
它的目的,我想,是允许新手程序员动态地改变数据,而无需使用“复杂的东西”等复合类型(数组和对象)。
我从来没有使用它们。
Answer 2:
变量中变量本质上是一个阵列(图/字典)。 以下是等价的想法:
<?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};
?>
所以,你从来没有“必须”来编写自己的代码来控制时使用的变量变量或变量属性。 我个人的偏好是从来没有使用可变的变量。 我偶尔使用不同属性,但更喜欢使用数组时,我会以这种方式来访问数据。
Answer 3:
就个人而言,我使用它们相当频繁。 以下类型的所有呼叫使用可变的变量:
$foo->$bar = 'test';
$foo->$bar();
$bar();
所以,你做一个动态方法/函数调用任何时候,您正在使用可变的变量...
一个常见的用途是通过访问受保护的属性__get
魔术方法。 我见过下面往往:
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
其定义是使用可变变量提供只读访问受保护的成员...
我从来没有直接使用$$var
语法(不要以为我是永远)。 我已经看到了用来访问名字全局变量global $$name; echo $$name;
global $$name; echo $$name;
但同样的事情可以用做$_GLOBALS[$name]
语法,所以这不是一个很好的用例(更不用说使用全局变量通常被看作是不好的做法)...
Answer 4:
你可以把它在一个模板系统使用,你使用的是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; ?>!
Answer 5:
我发现它在一个单一的情况下非常有用。 我有一个JSON格式的YouTube API的结果,这样的
$obj->media$title => Video title
所以,我用它像
$mt = 'media$title';
$obj->$mt ;
所以,它的工作对我来说在这里:)
Answer 6:
我主要用它来减少在一个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= '';
我希望它能帮助