我的目标是创建一个创建变量名的循环。如:
$variable1
$variable2
$variable3
并在循环内赋值。例如,for loop
从 1 到 7 生成变量$variable1, $variable2, $variable3,
.etc,每个变量都有迭代器的值。
有几种方法。一种是通过 string 和 double $
,但我不喜欢这种方法。程序员可以轻松删除双$
精度(将其视为 typeo)。
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;
}
编辑:澄清一下,你应该使用一个数组,因为没有代码(据我所知)可以接受 $variable1 但不接受 $variable[1]。动态生成变量名是各种各样的错误。
只是为了扩展其他人所说的为什么这是一种最好避免的技术:变量名仅供程序员使用;根据语言的运行时,它们没有关系或属性。因此,应该将相关变量的集合放入代表某个适当容器的变量中——在 PHP 的情况下,它是非常灵活的“数组”类型。
每当提出动态命名变量的问题时,通常是因为有人认为这是对特定问题的解决方案,但它通常会导致比它解决的问题更多的问题——例如,一旦程序的一部分开始动态命名变量,无处不在现在想要使用这些变量也必须动态命名它们;找出实际设置了哪些项目变得不必要地复杂,等等。
例如,对于某些类型的调试和元编程,变量变量很有用的上下文非常少,但是像goto
,它们在语言中的存在并不意味着您不首先尝试所有其他可能的解决方案。
但是,1000 次中有 999 次,如果您发现自己想知道如何动态创建变量名,您应该重新提出这个问题:您实际上想要实现什么,以及该问题的最佳解决方案是什么。如果使用此模式(并且可能还有全局变量)构建了一些现有/第 3 方代码,最好修补或包装它,而不是将错误设计传播到您自己的代码中。(诚然,包装器仍然需要知道如何声明动态变量。)
如果您有一个关联数组,我更喜欢使用该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++;
?>
那是不可能的,因为无法在运行时创建变量