在PHP中,有一个官方称为“Variable Variables”的功能,可以分配变量变量。变量变量将一个变量的值作为新变量的名称!例如:
$name='Joe';
$$name='Smith'; // could also be written as ${$name}='Smith'
第一个变量$ name包含值'Joe',而第二个变量名为$ Joe,变量值为'Smith'。考虑到PHP变量区分大小写!
我从未使用过此功能,也没有看到相关的目的。有人可以向我解释一下这个功能可以作为一种好的做法被利用吗?
答案 0 :(得分:10)
有时我们需要非常灵活且可以参数化的软件。当然,你必须准备整件事,但其中一部分来自用户输入,我们没有时间仅仅因为用户需要新的输入而改变软件。
使用变量和变量函数,您可以解决在没有它们的情况下难以解决的问题。
$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);
}
答案 1 :(得分:1)
您可以使用类似
的内容$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>";
}
在我看来是糟糕的老学校......
答案 2 :(得分:0)
在引用类中的变量时有一些用途,在某些情况下实际上可能需要这些变量(例如__get()
,__set()
,__isset()
和{{1 }})。但是,在大多数情况下,在全局变量上使用它们是不明智的。
请注意,在变量变量方面,绝不应直接接受最终用户输入。相反,应该使用包装函数来确保只允许特定输入。
在大多数情况下,不需要变量变量,建议您尽可能避免变量。
答案 3 :(得分:0)
根据@Faiz的答案(我接受了我的问题的正式答案),我创建了以下示例示例。
如果我有班级客户:
class Customer
{
public $firstname;
public $lastname;
public $country;
public $gender;
...
}
和带有INPUT / SELECT字段的网页HTML表单,其中包含姓名&#39;名字&#39;,&#39;姓氏&#39;,&#39;国家/地区&#39;性别&#39; ...
<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值清理。