【问题标题】:Variable variables in PHP - What is their purpose? [duplicate]PHP 中的变量 - 它们的目的是什么? [复制]
【发布时间】:2014-10-24 22:16:28
【问题描述】:

在 PHP 中有一个正式称为“Variable Variables”的功能,可以在其中分配变量变量。变量变量将一个变量的值作为新变量的名称!例如:

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

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

我从未使用过此功能,也看不出这样做的目的。有人可以向我解释一下这个功能在哪里可以作为一个好的实践来利用吗?

【问题讨论】:

  • 不能。请改用关联数组。请注意文档可以为他们建议的最佳用例是“有时很方便”的功能
  • 当然,我会这样做,但这正是我问的原因...... ;-)
  • 继续昆汀所说的话。任何时候你认为你可能想要使用 varvars,你都应该使用数组。

标签: php variables data-structures syntax


【解决方案1】:

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

如果我有客户类:

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

以及带有名称为“firstname”、“lastname”、“country”、“gender”的 INPUT/SELECT 字段的 Web HTML 表单......

<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 值清理。

【讨论】:

  • 伟大的是,同样的原理可以用于关联数据库行元素和类变量之间的映射!
【解决方案2】:

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

使用变量变量和变量函数,您可以解决没有它们就更难解决的问题。

快速示例:

无变量变量:

$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);
}

【讨论】:

  • 很好的例子,如果 $array 比 $_POST 更好!
  • @Faiz Ahmed 我看不出你在哪里使用变量变量?看起来你只是在遍历一个数组并传递 key=>value 对。
  • @user3796133 变量变量为$comment-&gt;$key,其中$key 替换了对象属性名称。这是检索动态指定的对象属性的唯一方法。您会注意到在“无变量变量”部分中,箭头后面的属性名称之前没有多余的$
  • 为什么不只是$comment = (object) \array_map('sanitize_value', $array);
【解决方案3】:

你可以使用类似的东西

$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>";       
        }

在我看来是糟糕的老学校......

【讨论】:

    【解决方案4】:

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

    请注意,当涉及到可变变量时,您绝不应该直接接受最终用户的输入。相反,应该使用包装函数来确保只允许特定的输入。

    大多数情况下,变量变量不是必需的,建议您尽可能避免使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2022-08-13
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多