我注意到有一个微妙的区别......如果我要编码:
echo "Welcome, $_SESSION['username'], you are logged in.";
解析时会失败。但是,如果我这样编码:
echo "Welcome, $_SESSION[username], you are logged in.";
它按预期工作,这让我想知道单引号是否真的有必要?我在PHP文档中找不到任何显示该效果的内容。
答案 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
中不存在的键。