如果我省略$ _variable ['variable']中的单引号会有所作为吗?

时间:2011-06-08 06:24:08

标签: php variables

  

可能重复:
  Accessing arrays whitout quoting the key

我注意到有一个微妙的区别......如果我要编码:

echo "Welcome, $_SESSION['username'], you are logged in.";

解析时会失败。但是,如果我这样编码:

echo "Welcome, $_SESSION[username], you are logged in.";

它按预期工作,这让我想知道单引号是否真的有必要?我在PHP文档中找不到任何显示该效果的内容。

6 个答案:

答案 0 :(得分:3)

这种方式错误但有效$_SESSION[username]并且需要更多时间来解析该关联索引的值。

影响PHP性能

  

始终在字符串周围使用引号   文字数组索引。例如,   $ foo ['bar']是正确的,而   $ foo [bar]不是。这是错的,但是   有用。原因是这段代码   有一个未定义的常数(bar)   比一个字符串('bar' - 注意到   引用).PHP将来可能会定义常量,不幸的是这些代码具有相同的名称。它的工作原理是因为PHP自动将一个裸字符串(一个与任何已知符号不对应的不带引号的字符串)转换为包含裸字符串的字符串。例如,如果没有定义的名为bar的常量,那么PHP将替换字符串'bar'并使用它。

访问值时应使用引号。

答案 1 :(得分:3)

在PHP中,未定义的全局常量becomes a string

Don't rely on this; 始终引用您的数组键。

然而,插入字符串it is fine,因为它已经是一个字符串。

Konforce在关于在字符串插值中使用大括号的注释中提出了一个很好的观点。

如果省略don't quote the key

如果您使用you must quote the key,则常量将为looked up

答案 2 :(得分:1)

请查看this文件

部分Array do's and don'ts

<?php
// Show all errors
error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// Correct
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Incorrect.  This works but also throws a PHP error of level E_NOTICE because
// of an undefined constant named fruit
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit];    // apple

// This defines a constant to demonstrate what's going on.  The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');

// Notice the difference now
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]";      // Hello apple

// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using superglobals in strings as well
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// Concatenation is another option
print "Hello " . $arr['fruit']; // Hello apple
?>

答案 3 :(得分:0)

在字符串中,省略单引号或将整个变量包装在{}"...{$array['key']}..."...$array[key]...)中。但是,强烈建议将其包装起来以防止出现"...$foobar..."之类的问题"...{$foo}bar..."(即变量$foo后跟bar)。

但您可能根本不想使用字符串变量,但要正确结束字符串:'...' . $var . '...'

答案 4 :(得分:0)

array documentation中,它被称为裸弦,绰绰有余。如果找不到与常量字符串匹配的常量 - 由于历史原因,它是一个字符串文字。然而,这种语法依赖于许多我不会涉及的语法问题,可读性也是一个问题。读者质疑自己 - 这是一个常数还是一个字符串?

现代PHP版本会针对此语法发出警告,以帮助通过使用单引号字符串(“用户名”)来解决此问题。

答案 5 :(得分:0)

是肯定的。
如果你传递一个没有任何引号的数组的参数,php将首先尝试将该参数解释为常量,如果没有定义,它将按预期运行。即使它可以给出相同的结果,但它明显更慢引用的论点。
以下是一个可能不起作用的示例:

define("a_constant","a value");
$a = array("a_constant"=>"the right value");
echo $a[a_constant]; 

a_constant变量的值为“值”,因此$a[a_constant]会转换为$a["a value"],这是数组$a中不存在的键。