你好,我读过一段时间,在括号内使用单引号而不是不这样做更安全,是真的吗?
echo $row[0];
echo $row[id];
或者
echo $row['0'];
echo $row['id'];
是的,因为您可能有:
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
on 进行开发的原因。通过将其放置error_reporting(E_ALL | E_STRICT);
在脚本的顶部来打开它。
$row[0]
并且$row["0"]
是等效的,您可以根据需要使用它们(索引数组与关联数组?)
你的第一个例子: [0]
或['0']
这不需要引号,因为键是数字的。
你的第二个例子: [id]
或['id']
这绝对应该有引号。不带引号的变体是 PHP 中的一个遗留特性,真的不应该再使用了。
如果您不包含引号,您实际上是在告诉 PHP 使用define()
named id
,而不是 string id
。在大多数情况下,这是可行的,因为 PHP 有一个特性,如果你指定一个不存在的定义,它会假定字符串等价,而不是抛出错误。(这是 PHP 最糟糕的设计决策之一,但这里无关紧要)
关键是,在大多数情况下,无论哪种方式,它都会做同样的事情。不带引号的版本会运行得更慢,因为它需要搜索定义并在找不到时进行字符串转换,但不会慢很多;你不会注意到它。
真正的危险是,如果您在代码的其他地方创建了同名的定义——例如:
define('id','blahblah');
现在 PHP 将$var[id]
被视为 being $var['blahblah']
,这将破坏您的代码。
知道何时使用定义并不总是那么容易——特别是如果你包含第三方库——这意味着虽然你的代码没有引号现在可以工作,但不知道什么时候它可能会突然中断,没有你能够找出原因。
因此,建议在数组元素名称为字符串时始终使用引号。
引号表示字符串文字,而未加引号表示整数或常量。
如果您要在关联数组中查找命名数组键,通常您希望使用字符串文字。IE$row['id']
而不是$row[id]
(这不应该工作)。
如果您正在寻找数字数组键,则字符串将被转换为整数。所以$row['0']
应该评估为$row[0]
. 不过,我认为使用实际整数 ( $row[0]
) 是一种更好的做法。我不确定变量转换是否会影响实际性能,但最好使用正确的数据类型以提高可读性和准确性。