我正在做一个基本的测验。我不明白最后一部分:$_SESSION["x{$user['serial']}"]
x{5}
数组值究竟是什么意思?x
在任何地方都没有定义,通常对象文字应该像{x: 5}
一样——这方面的一些帮助会很好。
session_start();
function setData($data){
if(is_array($data)){
$x = 1;
foreach ($data as $key => $value) {
$_SESSION["x$value"] = $x;
$x++;
}
}
}
$user = array('id'=>3,'serial'=>5);
setData($user);
echo $_SESSION["x{$user['serial']}"];
花括号用于扩展双引号字符串中的复杂表达式,如数组。
因此,在您的示例中,x{$user['serial']}
将扩展为"x5"。您也可以将x$value
写为x{$value}
,两者都具有相同的结果。
顺便说一句,对象文字是Javascript的,而不是PHP的:)
不能访问双引号字符串中的(所有类型的)数组。
例如:
echo "x$user['serial']";
这导致:
PHP Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in php shell code on line 1
换句话说,访问索引数组("$user[0]"
)中的数组元素是有效的,但访问具有字符串文字的关联元素则无效。
不起作用,因为它太复杂,无法解析。通过使用荣誉,你说这个部分应该单独解释。
因此:
echo "x{$user['serial']}";
相当于:
echo "x".$user['serial'];
由此产生的代码是:
echo $_SESSION["x".$user['serial']];
但更简单。
给定您的示例$user
,结果是您从$_SESSION
访问x5
。
它不是x{5}
,因为它没有任何意义。表达式:
"x{$user['serial']}"
是一个用双引号括起来的字符串。在用双引号括起来的字符串中,PHP执行其他语言中所称的"变量插值"。在普通英语中,它搜索变量名并用它们的值替换它们。
它可以很容易地识别字符串中的变量名并替换它们,但当您想要使用更复杂的表达式(如数组或对象)时,事情会变得更加困难。它可以尝试猜测程序员想要什么,但这不是一个解决方案。
这就是为什么PHP只在双引号中找到简单的变量,并依赖程序员在他们想要插入数组和对象等复杂事物时发出信号。程序员使用大括号({
和}
)来告诉PHP插入字符串中的复杂表达式。
查看PHP手册中有关字符串解析的文档。
在不使用大括号的情况下,在字符串"x$user['serial']"
中,PHP识别变量$user
并忽略['serial']
部分。它试图用它的字符串表示代替$user
,因为它是一个数组,所以最后的字符串变成了"xArray['serial']"
,而这不是您想要的。
如果变量$field
是用字符串'serial'
正手初始化的,那么使用大括号可以让程序员编写类似"x{$user[$field]}"
的内容。
如果是$user['serial'] == 5
,则最终结果是$_SESSION["x5"]
。
花括号总是可以用来将变量名括在双引号字符串中。例如,在这种情况下,它们是有用的:
$sep = '--';
$str = "a{$sep}b";
// echo($str) will produce: a--b
变量$sep
周围没有大括号,字符串看起来像"a$sepb"
,PHP在其中找到了变量名$sepb
,因为不存在这样的变量,$str
的值变成了"a"
,这不是我们想要的。