在PHP中将括号与动态变量名称一起使用


191

我正在尝试使用动态变量名称(我不确定它们的实际名称),但是非常像这样:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

回报是null告诉我它不起作用。我不知道我在寻找什么语法或技术,这使得很难研究。$filelist在前面定义。


22
不要啦!从来没有充分的理由使用它们。实际上,它们只是一个不整洁的数组。请改用适当的数组。
昆汀

好吧,很抱歉,我回过头来为到目前为止我提出的每个问题选择了一个答案。好东西只有7:P
user1159454

2
还有昆汀,为​​什么他们做得不好?我认为,它们与数组并存存在一定的原因
user1159454'2

@ user1159454 —它们是杂乱无章的混乱,没有所有可应用于它们可用的阵列的工具。它们存在的原因是古老的遗产原因和疯狂的案例。
昆汀

8
疯狂的案例可能正是为什么有人要问这个问题的原因。
文森特2014年

Answers:


511

将它们包装在{}

${"file" . $i} = file($filelist[$i]);

工作实例


使用${}是创建动态变量的一种方法,简单的示例:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
是否也可以使用相同的逻辑创建动态数组?
dtakis 2013年

我对@dtakis也有同样的疑问,您能帮我们吗?如果可能的话,请看一下这个问题
Marcio Mazzucato 2014年

如果您正在使用它来包含一个变量(恕我直言,这是最有用的方法),请紧记警告,不要忘记使用双引号。${'fixedTime$i'} = $row['timeInstance'];给了您一个不是很有用的$fixedTime$i替代品$fixedTime1, $fixedTime2。(幸运的是,它几乎马上就被发现了。)
BeNice

81

总览

在PHP中,您可以$在变量前面加上一个额外的符号,以使其成为动态变量:

$$variableName = $value;

尽管我不推荐这样做,但您甚至可以将这种行为链接起来:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

您可以但不会被迫$variableName介于以下之间{}

${$variableName} = $value;

{}仅当变量名称本身是多个值的组合时,才必须使用,例如:

${$variableNamePart1 . $variableNamePart2} = $value;

但是,建议始终使用{},因为它更具可读性。

PHP5和PHP7之间的区别

始终使用的另一个原因{}是,PHP5和PHP7处理动态变量的方式略有不同,这在某些情况下会导致不同的结果。

在PHP7中,现在将严格按照从左到右的顺序对动态变量,属性和方法进行评估,而不是在PHP5中混合特殊情况。以下示例显示了评估顺序如何变化。

情况1 : $$foo['bar']['baz']

  • PHP5插值: ${$foo['bar']['baz']}
  • PHP7插入: ${$foo}['bar']['baz']

情况2: $foo->$bar['baz']

  • PHP5插值: $foo->{$bar['baz']}
  • PHP7插入: $foo->{$bar}['baz']

情况3: $foo->$bar['baz']()

  • PHP5插值: $foo->{$bar['baz']}()
  • PHP7插入: $foo->{$bar}['baz']()

情况4: Foo::$bar['baz']()

  • PHP5插值: Foo::{$bar['baz']}()
  • PHP7插入: Foo::{$bar}['baz']()

6
一个可疑话题的好答案。我真的很高兴我不必调试此类代码。
martinstoeckli

4
最佳答案,因为它只是回答问题而没有判断力
Rid Iculous

2
是的,我们在一些旧代码方面也遇到了麻烦。生产是PHP5.5,开发环境是PHP7。我赞成这个问题。
Ogier Schelvis,2016年


5

我经常对查询返回的结果进行此操作。

例如

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

现在我可以只使用$ MyFieldname(在echo语句等中更容易使用),而不是$ MyQueryResult ['MyFieldname']

是的,可能很懒,但是我从来没有遇到任何问题。


14
您是否曾经尝试使用PHP的extract()函数?php.net/manual/en/function.extract.php
DarkSide 2013年

1
方便的一线式DB结果集:foreach($ row as $ k => $ v){$$ k = $ v}
Rid Iculous

2

Tom,如果您有现有的数组,则可以将该数组转换为对象,并按以下方式使用它:

$r = (object) $MyQueryResult;
echo $r->key;

0

我有一个动态创建变量值并将所有值合并到一个变量中的解决方案。

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

我当时有6个相同的数组,我需要根据另一个变量选择正确的数组,然后为其分配值。在这里显示的情况下,$ comp_cat是'a',所以我需要选择'a'数组(我当然也有'b'至'f'数组)

请注意,变量在数组中的位置值位于右括号之后。

$ {'comp_cat _'。$ comp_cat .'_ arr'} [1] [0] =“ FRED BLOGGS”;

$ {'comp_cat _'。$ comp_cat .'_ arr'} [1] [1] = $ file_tidy;

echo'第一个数组值为'。$ comp_cat_a_arr [1] [0]。第二个值为。$ comp_cat_a_arr [1] [1];


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.