0

你好,我读过一段时间,在括号内使用单引号而不是不这样做更安全,是真的吗?

echo $row[0];
echo $row[id];

或者

echo $row['0'];
echo $row['id'];
4

3 回答 3

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_STRICTon 进行开发的原因。通过将其放置error_reporting(E_ALL | E_STRICT);在脚本的顶部来打开它。

$row[0]并且$row["0"]是等效的,您可以根据需要使用它们(索引数组与关联数组?)

于 2012-11-28T16:53:53.397 回答
1
  • 你的第一个例子: [0]['0']

    这不需要引号,因为键是数字的。

  • 你的第二个例子: [id]['id']

    这绝对应该有引号。不带引号的变体是 PHP 中的一个遗留特性,真的不应该再使用了。

    如果您不包含引号,您实际上是在告诉 PHP 使用define()named id,而不是 string id。在大多数情况下,这是可行的,因为 PHP 有一个特性,如果你指定一个不存在的定义,它会假定字符串等价,而不是抛出错误。(这是 PHP 最糟糕的设计决策之一,但这里无关紧要)

    关键是,在大多数情况下,无论哪种方式,它都会做同样的事情。不带引号的版本会运行得更慢,因为它需要搜索定义并在找不到时进行字符串转换,但不会慢很多;你不会注意到它。

    真正的危险是,如果您在代码的其他地方创建了同名的定义——例如:

     define('id','blahblah');
    

    现在 PHP 将$var[id]被视为 being $var['blahblah'],这将破坏您的代码。

    知道何时使用定义并不总是那么容易——特别是如果你包含第三方库——这意味着虽然你的代码没有引号现在可以工作,但不知道什么时候它可能会突然中断,没有你能够找出原因。

    因此,建议在数组元素名称为字符串时始终使用引号。

于 2012-11-28T17:09:50.677 回答
0

引号表示字符串文字,而未加引号表示整数或常量。

如果您要在关联数组中查找命名数组键,通常您希望使用字符串文字。IE$row['id']而不是$row[id](这不应该工作)。

如果您正在寻找数字数组键,则字符串将被转换为整数。所以$row['0']应该评估为$row[0]. 不过,我认为使用实际整数 ( $row[0]) 是一种更好的做法。我不确定变量转换是否会影响实际性能,但最好使用正确的数据类型以提高可读性和准确性。

于 2012-11-28T17:00:37.933 回答