问题 PHP中的变量变量 - 它们的用途是什么?


在PHP中,有一个官方称为“变量变量“可以指定变量变量。变量变量将一个变量的值作为新变量的名称!例如:

$name='Joe';
$$name='Smith'; // could also be written as ${$name}='Smith'

第一个变量$ name包含值'Joe',而第二个变量名为$ Joe,变量值为'Smith'。考虑到PHP变量区分大小写!

我从来没有使用过这个功能,也没有看到它的目的。有人可以向我解释一下这个功能可以作为一种好的做法被利用吗?


5817
2017-08-31 14:43


起源

它不能。请改用关联数组。注意文档可以为他们建议的最佳用例的功能是“有时它很方便” - Quentin
当然,我这样做,但这正是我问的原因...... ;-) - sbrbot
借调昆汀说的话。只要您认为可能需要使用varvars,就应该使用数组。 - Niet the Dark Absol


答案:


有时我们需要非常灵活的软件,并且我们可以进行参数化。当然,你必须准备整件事,但其中一部分来自用户输入,我们没有时间仅仅因为用户需要新输入而更改软件。

使用变量和变量函数,您可以解决在没有它们的情况下难以解决的问题。

快速示例:

没有变量:

$comment = new stdClass(); // Create an object

$comment->name = sanitize_value($array['name']);
$comment->email = sanitize_values($array['email']);
$comment->url = sanitize_values($array['url']);
$comment->comment_text = sanitize_values($array['comment_text']);

随变量变量

$comment = new stdClass(); // Create a new object


foreach( $array as $key=>$val )
{
    $comment->$key = sanitize_values($val);
}

9
2017-08-31 15:14



优秀的例子,如果$ array是$ _POST甚至更好! - sbrbot


你可以使用类似的东西

$labels = array( 'first_name" => 'First Name", 'middle_name" => 'Middle Name", 'last_name" => 'Last Name", 'phone" => 'Phone");
        foreach($labels as $field => $label)
        {
        echo '<div id='field'><label for='$field'>$label</label>
        <input id='$field' name='$field' type='text' value='".$$field."' /></div>";       
        }

在我看来是坏老派...


1
2017-08-31 15:00





这在引用类中的变量时有一些用途,并且在某些情况下实际上可能需要这些变量(例如 __get()__set()__isset(),和 __unset())。但是,在大多数情况下,在全局变量上使用它们是不明智的。

请注意,在变量变量方面,绝不应直接接受最终用户输入。相反,应使用包装函数来确保仅允许特定输入。

 在某些情况下,不需要变量变量,建议您尽可能避免使用它们。


0
2017-08-31 14:55





根据@Faiz的答案(我接受了我的问题的正式答案),我创建了以下示例示例。

如果我有班级客户:

class Customer
{
  public $firstname;
  public $lastname;
  public $country;
  public $gender;
  ...
}

和带有INPUT / SELECT字段的Web HTML表单,其名称为'firstname','lastname','country','gender'...

<form action="..." method="post">
  <input type="text" name="firstname" value="" />
  <input type="text" name="lastname" value="" />
  <select name="country">
    <option value="AL">Albania</option>
    <option value="BE">Belgium</option>
    <option value="HR">Croatia</option>
    ...
  </select>
  <input type="radio" name="gender" value="M" />Man
  <input type="radio" name="gender" value="F" />Woman
  ...
  <input type="submit" value="Submit" />
</form>

通常在我的动作脚本中,我会将这些表单字段逐个映射到类变量中:

$Customer=new Customer();
$Customer->firstname=$_POST['firstname'];
$Customer->lastname=$_POST['lastname'];
$Customer->country=$_POST['country'];
$Customer->gender=$_POST['gender'];
...
$Customer->create();

但是使用变量变量我可以使用下面的一行foreach循环轻松地将所有关联数组值(可能有很多容易出错的数据)映射到类变量中;

$Customer=new Customer();
foreach($_POST as $key=>$value) $Customer->$key=$value;
$Customer->create();

注意:为了回答(逻辑)简单和清晰,我省略了$ _POST值清理。


0
2017-08-31 22:20



很好。你明白了! - Faiz Ahmed
最棒的是,相同的原理可以用于关联数据库行元素和类变量之间的映射! - sbrbot