在PHP中使用带有动态变量名的大括号

use*_*454 177 php variables dynamic dynamic-variables

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

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

var_dump($file0);
Run Code Online (Sandbox Code Playgroud)

回报null告诉我它不起作用.我不知道我正在寻找的语法或技术是什么,这使得研究变得困难.$filelist早先定义.

Sar*_*raz 483

包裹他们{}:

${"file" . $i} = file($filelist[$i]);
Run Code Online (Sandbox Code Playgroud)

工作实例


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

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Run Code Online (Sandbox Code Playgroud)

  • 是否也可以使用相同的逻辑创建动态数组? (4认同)

Joh*_*ers 74

概观

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

$$variableName = $value;
Run Code Online (Sandbox Code Playgroud)

虽然我不推荐它,你甚至可以链接这种行为:

$$$$$$$$DoNotTryThisAtHomeKids = $value;
Run Code Online (Sandbox Code Playgroud)

你可以,但不强制放$variableName之间{}:

${$variableName} = $value;
Run Code Online (Sandbox Code Playgroud)

{}只有在变量名称本身是多个值的组合时才使用,如下所示:

${$variableNamePart1 . $variableNamePart2} = $value;
Run Code Online (Sandbox Code Playgroud)

然而,建议始终使用{},因为它更具可读性.

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认同)
  • 最好的答案,因为它只是回答问题而不是评判 (4认同)
  • 是的,我们只是遇到了一些遗留代码的问题.产量为PHP5.5,Dev环境为PHP7.我很喜欢这个问题. (2认同)

Joa*_*son 20

尝试使用{}而不是():

${"file".$i} = file($filelist[$i]);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

例如

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

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您是否曾经尝试使用PHP的extract()函数?http://php.net/manual/zh/function.extract.php (13认同)