您好我读了一段时间,使用括号内的单引号更安全而不是不做,是真的吗?
echo $row[0];
echo $row[id];
或
echo $row['0'];
echo $row['id'];
答案 0 :(得分:2)
是的,因为你可能有:
define("id", "something else");
$row = array(
"id" => 5,
"something else" => "foobar"
);
echo $row["id"]; // 5
echo $row[id]; // foobar
同样在E_STRICT
模式$row[id]
会给您一个警告。这就是为什么你应该始终使用E_STRICT
开发。将error_reporting(E_ALL | E_STRICT);
放在脚本顶部即可将其打开。
$row[0]
和$row["0"]
是等价的,您可以根据需要使用这些(索引数组与关联数组?)
答案 1 :(得分:1)
您的第一个示例:[0]
或['0']
这不需要引号,因为键是数字。
您的第二个示例:[id]
或['id']
这绝对应该有引号。没有引号的变体是PHP中的遗留功能,实际上不应再使用它。
如果您不包含引号,那么您实际上是在告诉PHP使用名为define()
的{{1}},而不是字符串id
。在大多数情况下,这是有效的,因为PHP有一个功能,如果你指定一个不存在的定义,它会假定字符串等效,而不是抛出错误。 (这是PHP最糟糕的设计决策之一,但这不是重点)
关键在于,在大多数情况下,无论哪种方式都会完全相同。没有引号的版本将运行得更慢,因为它需要搜索定义并在找不到它时进行字符串转换,但它不会慢得多;你不会注意到它。
真正的危险是,如果你的代码中的其他地方你创建了一个具有相同名称的定义 - 例如:
id
现在,PHP会将 define('id','blahblah');
视为$var[id]
,这会破坏您的代码。
在使用定义时并不总是很容易知道 - 特别是如果您包括第三方库 - 这意味着虽然没有引号的代码现在可以使用,但是不知道什么时候可能会突然中断,而你却无法解决原因。
因此建议总是在数组元素名称为字符串时使用引号。
答案 2 :(得分:0)
quote表示字符串文字,而unquoted表示整数或常量。
如果要在关联数组中查找命名数组键,通常需要使用字符串文字。 I.E $row['id']
而不是$row[id]
(这不应该起作用)。
如果您正在寻找数字数组键,则字符串将转换为整数。因此$row['0']
应评估为$row[0]
。不过,我认为使用实际整数($row[0]
)是一种更好的做法。我不确定是否由于变量转换而导致实际性能损失,但最好使用正确的数据类型以提高可读性和准确性。