$ foo [' bar'] ="价值"之间的区别是什么?和$ foo [bar] ="价值"

时间:2018-05-23 14:44:13

标签: php

所以我有一些看起来像的代码:

$foo[bar]="value 1";
$foo[time]="value 2";
$foo[location]="value 3";
...

认为它应该是$foo['bar']="value 1",但我想知道为什么(以及了解更多相关信息的术语)以及为什么它可以工作如果这是&# 34;糟糕的代码"?单独留下代码有什么危险?添加引号会有什么机会破坏某些东西?

跟进/奖金: 嵌套数组怎么样?

$colors=array("r"=>"red","b"=>"black","u"=>"blue");
...
$foo[$colors["r"]]="value";
or
$foo["$colors["r"]"]="value";

这里我想要第一个,因为我使用变量作为键?!

2 个答案:

答案 0 :(得分:3)

正如费德里科所说。这两个意味着不同的东西。没有引用的那个是变量。 $ foo [bar]中变量 bar 的内容取决于您之前分配的内容。带引号' bar' 的字符串是一个字符串,其值固定,它将分配' bar'作为关键。

对于你的问题是哪一个以及为什么,这实际上取决于场景,但对于大多数人来说,你可能会使用' bar'版本而不是变量 bar 版本,原因如下:

  1. Variable版本可能会产生错误。我说可能取决于流程。由于代码的其他部分分配了一个错误的值,它不应该存在或 bar 根本没有被分配。
  2. 固定的酒吧'版本更明确。每个阅读代码的人都知道密钥是什么。没有猜测。
  3. 带引号版本的唯一标注' bar'为什么它可能是坏的是因为字符串被硬编码为' bar的性质。假设您在10个地方推荐这个$ foo [' bar'],并且有一天您决定从' bar'到' bar1',然后你需要在10个地方更改它。更糟糕的是,你可能只改变了其中的9个并且忘了改变引入新bug的那个。密钥最好成为常量并在代码中引用该常量。这样,如果您需要更改密钥名称,您可以为其分配新值,并相应地更新所有位置。这通常是至少我知道的编程语言遵循的规则。

    我希望这个答案有所帮助。

答案 1 :(得分:1)

bar是变量,'bar'是字符串。 不同的是,bar可以存储值,“bar”本身就是一个值。两者都将用作数组$ arr中的键。但是使用bar,数组索引会变化,并且'bar'将修复关键索引。 $ arr [bar]可以是索引或关联的,而$ arr ['bar']将是关联数组。