我的目标是创建一个变量名的循环。如:
$variable1
$variable2
$variable3
和循环中的赋值。例如,从1到7的for loop
产生变量$variable1, $variable2, $variable3,
.etc,每个变量都具有迭代器的值。
有几种方法。一种是通过字符串和双$
,但我不喜欢这种方法。程序员可以很容易地删除双$
(将其视为类型)。
for($i = 0; $i <= 7; $i++) {
$name = "variable{$i}";
$$name = "foo";
}
最好的方法是显式语句。
for($i = 0; $i <= 7; $i++) {
${"variable$i"} = "foo";
}
使用显式内联字符串,您所做的意图是毫无疑问的。其他PHP程序员不会错误地修改代码。
您应该使用数组:
for($i = 1; $i <= 7; $i++) {
$variable[$i] = $i;
}
Edit:澄清一下,你应该使用数组,因为没有代码(据我所知)会接受$variable1但不接受$variable[1]。动态生成变量名是各种错误的
只是扩展一下其他人所说的最好避免使用这种技术的原因:变量名仅供程序员使用;根据语言的运行时,它们没有关系或属性。因此,应该将相关变量的集合放入代表某种适当容器的变量中——在PHP中,它是非常灵活的"数组"类型。
每当提出动态命名变量的问题时,通常是因为有人认为它是解决特定问题的方法,但它通常会导致比它解决的问题更多的问题-例如,一旦程序的一部分开始动态命名变量,现在想要使用这些变量的任何地方也必须动态命名它们;找出实际设置了哪些项变得不必要地复杂,等等。
在极少数情况下,变量变量是有用的,例如,对于某些类型的调试和元编程,但是像goto
,它们在语言中的存在不应该意味着你不首先尝试所有其他可能的解决方案。
应该重新考虑这个问题:您实际上试图实现什么,以及该问题的最佳解决方案是什么。如果使用这种模式构建了一些现有的/第三方代码(可能还有全局变量),那么最好对其进行修补或包装,而不是将错误设计传播到您自己的代码中。(诚然,包装器仍然需要知道如何声明动态变量。)
如果您有一个关联数组,我更倾向于使用extract()
方法。点击这里查看
<?php
/* Suppose that $var_array is an array*/
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape";
?>
上面的代码将输出:blue, large, sphere, medium
如果有人想通过一个对象来做这件事:
<?php
$x = 1;
while($x <= 4){
echo $q->{"a$x"};
$x++;
?>
这是不可能的,因为变量不能在运行时创建