变量变量的实际用途是什么?

时间:2010-08-19 15:57:36

标签: php variable-variables

变量变量看起来很酷,但我想不出有人会在生产环境中实际使用它们的情况。这种情况会是什么样的?它们是如何使用的?

6 个答案:

答案 0 :(得分:4)

我的目的是让新手程序员动态更改数据,而不使用复杂类型(数组和对象)等“复杂的东西”。

我从不使用它们。

答案 1 :(得分:2)

变量变量本质上是一个数组(map / dictionary)。以下是相同的想法:

<?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};
?>

因此,在编写自己的受控代码时,您永远不会“拥有”使用变量或变量属性。我个人的偏好是永远不要使用变量变量。我偶尔会使用变量属性,但在我以这种方式访问​​数据时更喜欢使用数组。

答案 2 :(得分:1)

将其视为在使用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; ?>!

答案 3 :(得分:1)

就个人而言,我经常使用它们。以下类型的所有调用都使用变量:

$foo->$bar = 'test';
$foo->$bar();
$bar();

所以每当你进行动态方法/函数调用时,你都在使用变量......

通常用于通过__get魔术方法访问受保护的属性。我经常看到以下内容:

public function __get($name) {
    return isset($this->$name) ? $this->$name : null;
}

根据定义,它使用变量来提供对受保护成员的读访问权......

我从未直接使用$$var语法(并且我认为不会这样)。我已经看到它用于通过名称global $$name; echo $$name;访问全局变量,但使用$_GLOBALS[$name]语法可以完成同样的事情,因此这不是一个好的用例(更不用说使用全局变量是通常被视为不良做法)...

答案 4 :(得分:1)

我发现它在单个场景中很有用。我正在使用JSON格式获得YouTube API结果,例如

 $obj->media$title => Video title

所以我用它就像

$mt = 'media$title';
$obj->$mt ;

所以这对我有用:)

答案 5 :(得分:0)

我主要用它来减少在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= '';

我希望它有所帮助