PHP - 如何在循环中创建变量名?

12

我的目标是创建一个循环,其中创建变量名。例如:

$variable1
$variable2
$variable3

并在循环内为其赋值。例如,从1到7的for循环将产生变量$variable1,$variable2,$variable3等,每个变量的值都是迭代器的值。


9
使用数组... - Ondřej Mirtes
1
可能是重复的问题:如何在循环中更改PHP变量名称? - IMSoP
如果您发布实际问题的上下文,我们可能能够提供不需要此功能的替代解决方案,并且会导致更清晰的代码。 - IMSoP
可能是如何在循环中更改PHP变量名称?的重复。 - Jules
6个回答

54

有几种方法。其中一种是使用字符串和双倍符号$,但我不喜欢这种方法。程序员可能会轻易地删除双倍符号$(认为它是拼写错误)。

for($i = 0; $i <= 7; $i++) {
     $name = "variable{$i}";
     $$name = "foo";
}

最好的方法是明确陈述。

for($i = 0; $i <= 7; $i++) {
     ${"variable$i"} = "foo";
}

使用显式的内联字符串,可以消除关于你所做的意图的疑虑。另一个 PHP 程序员不会错误地更改代码。


实际上,由于某些原因,我的第一个解决方案不起作用。在多个服务器上尝试过:http://ideone.com/rvJnj7。我已删除我的帖子。 - jeremy
1
@Nile 我正要对此发表评论:它看起来像是可以工作的,但实际上并不行。http://codepad.org/L6XYoGNM - PHP将$variable{$i}视为尝试索引变量$variable中的数组元素或字符串字节的操作,就像$variable[$i]一样;如果给定一个未设置的值,它会优先选择数组。因此,在这里,您实际上正在初始化一个索引数组,而不是所请求的一组命名变量。 - IMSoP

17

你应该使用数组来实现这个:

for($i = 1; $i <= 7; $i++) {
  $variable[$i] = $i;
}

编辑: 为澄清起见,你应该使用数组,因为(据我所知)没有可以接受$variable1但不接受$variable[1]的代码。动态生成变量名是完全错误的。


@MathewFoscarini 我找不到“屈折”的任何编程含义;你是指“反射”吗?如果是的话,动态命名变量与反射有什么关系(顺便说一下,PHP确实支持反射)? - IMSoP
@IMSoP 的“inflection”指的是在运行时修改对象的原始含义。PHP 是一种动态语言,旨在执行此类操作。虽然这不是一个好主意,但在 PHP 中编程也不是一个好主意 ;) - Reactgular
+1 这绝对是正确的做法,但并不能解决原帖作者的问题。可悲的是,这就是程序员的生活。 - Reactgular
@MathewFoscarini 好的,我之前没有听过那个定义。不过我不确定它在这里如何适用,因为我们并没有改变变量的含义,我们只是在运行时命名变量,这种做法有极其有限的用途。 - IMSoP
@IMSoP,“inflection”这个词是一个模糊的术语,它指的是在对象定义/声明/创建之后对其进行更改。这取决于编程语言。在运行时重命名变量有点类似。就像在JavaScript中,您可以在运行时向对象添加函数或重命名这些函数一样。这些只是语言特性。为什么会这样呢?我不知道,但越灵活,滥用的难度就越大。 - Reactgular
显示剩余3条评论

5
仅就其他人所说的为什么这是一种最好避免的技术进行扩展:变量名仅供程序员使用;它们没有语言运行时的关系或属性。因此,相关变量的集合应该放入一个代表某个适当容器的变量中,在PHP的情况下,它非常灵活的“数组”类型。

每当动态命名变量的问题被提出时,通常是因为有人认为它是解决特定问题的方法,但它通常会带来比解决更多的问题-例如,一旦程序的一部分开始动态命名变量,现在想要使用这些变量的任何地方也必须动态命名它们;找出哪些项目实际上已设置变得不必要复杂,等等。

有极少数情况下,变量变量对于某些调试和元编程非常有用,但像goto一样,它们在语言中的存在不应意味着您不首先尝试每种可能的解决方案。

虽然在1000次中有999次,如果你发现自己在思考如何动态创建变量名,你应该重新提出问题:你实际上想要实现什么,以及最好的解决方案是什么。如果一些现有的/第三方代码使用了这种模式(并且可能也使用了全局变量),那么最好的做法是修补或包装它,而不是将错误设计传播到你自己的代码中。(不可否认,包装器仍需要知道如何声明动态变量。)


1
如果你有一个关联数组,我更喜欢使用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";

?>

上述代码将输出:蓝色,大号,球体,中号

0

如果有人想通过对象来实现这个:

<?php 
        $x = 1;
        while($x <= 4){
        echo $q->{"a$x"}; 
        $x++;
?>

-16

这是不可能的,因为变量不能在运行时创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接