【问题标题】:PHP - How Can I Create Variable Names Within a Loop?PHP - 如何在循环中创建变量名?
【发布时间】:2013-06-12 16:18:07
【问题描述】:

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

$variable1
$variable2
$variable3

并在循环内赋值。例如,从 1 到 7 的 for loop 会生成变量 $variable1, $variable2, $variable3, .etc,每个变量都有迭代器的值。

【问题讨论】:

标签: php variables


【解决方案1】:

如果有人想通过一个对象来做到这一点:

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

【讨论】:

    【解决方案2】:

    如果你有一个关联数组,我更喜欢使用extract() 方法。看看here

    例如

    <?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

    【讨论】:

      【解决方案3】:

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

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

      变量变量在极少数情况下很有用,例如,对于某些类型的调试和元编程,但就像goto,它们在语言中的存在并不意味着你不会尝试其他首先可能的解决方案。

      1000 次中有 999 次,但是,如果您发现自己想知道如何动态创建变量名,您应该重新提出这个问题:您实际上想要实现什么,最好的解决方案是什么那个问题。如果使用此模式(并且可能还有全局变量)构建了一些现有/第 3 方代码,最好修补或包装它,而不是将错误设计传播到您自己的代码中。 (诚​​然,包装器仍然需要知道如何声明动态变量。)

      【讨论】:

        【解决方案4】:

        有几种方法。一种是通过字符串和双精度$,但我不喜欢这种方法。程序员可以轻松删除双精度 $(将其视为 typeo)。

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

        最好的方法是显式声明。

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

        使用显式内联字符串,您所做的事情的意图毫无疑问。其他 PHP 程序员不会错误地修改代码。

        【讨论】:

        • 实际上,出于某种原因,我的第一个解决方案不起作用。在多台服务器上尝试过:ideone.com/rvJnj7。我已经删除了我的帖子。
        • @Nile 我正要评论它:它看起来可以工作,但它不能codepad.org/L6XYoGNM - PHP 将$variable{$i} 视为尝试索引变量$variable 中的数组元素或字符串的字节,就像$variable[$i] 一样;给定一个未设置的值,它更喜欢一个数组。所以你实际上是在这里初始化一个索引数组,而不是请求的一组命名变量。
        【解决方案5】:

        您应该为此使用数组:

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

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

        【讨论】:

        • @Kolink 他们是 PHP 版本的其他语言的变形。
        • @MathewFoscarini 我找不到“变形”的任何编程含义;您指的是 “reflection” 吗?如果是这样,动态命名变量与反射有什么关系(顺便说一下,PHP 确实支持)?
        • @IMSoP inflection 表示在运行时从其原始含义修改对象。 PHP 是一种动态语言,旨在做这种事情。虽然这不是一个好主意,但用 PHP 编程也不是一个好主意 ;)
        • +1 这完全是正确的做法,但不能解决 OP 的问题。可悲的是,这就是程序员的生活。
        • @MathewFoscarini 好的,我没有听说过这个定义。不过,不确定它是如何应用在这里的,因为我们并没有改变变量的含义,而是在运行时命名变量,用途极其有限。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2011-09-15
          • 1970-01-01
          • 2012-01-05
          • 2019-11-28
          • 2019-10-04
          • 2011-09-08
          • 2016-05-17
          • 2014-11-24
          • 2020-06-07
          相关资源
          最近更新 更多