我做了一个基本的测验。我不明白最后一部分:
$_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']}"];
答案 0 :(得分:2)
花括号用于扩展双引号字符串中的复杂表达式,如数组。
因此,在您的示例中,x{$user['serial']}
将扩展为" x5"。您也可以将x$value
写为x{$value}
,两者都具有相同的结果。
顺便说一句,对象文字用于Javascript,而不是PHP:)
答案 1 :(得分:1)
您无法以双引号字符串访问(各种)数组。
例如:
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
,结果是您从x5
访问$_SESSION
。
答案 2 :(得分:1)
它不是x{5}
,因为它并不意味着什么。表达式:
"x{$user['serial']}"
是string enclosed in double quotes。在用双引号括起来的内部字符串中,PHP会在其他语言中执行调用"变量插值"。用简单的英语,它搜索变量名称并用它们的值替换它们。
它可以轻松识别字符串中的变量名称并替换它们,但是当您想要使用更复杂的表达式(如数组或对象)时,事情变得更加困难。它可能试图猜测程序员想要什么,但这不是解决方案。
这就是为什么PHP只在双引号中找到简单的变量,并依赖程序员在想要插入像数组和对象这样的复杂事物时发出信号。程序员使用花括号({
和}
)来告诉PHP有关插入字符串的复杂表达式。
在PHP手册上查看有关字符串解析的文档。
不使用花括号,在字符串"x$user['serial']"
中,PHP识别变量$user
并忽略['serial']
部分。它试图用它的字符串表示替换$user
,因为它是一个数组,最后的字符串变成"xArray['serial']"
,这不是你想要的。
使用花括号允许程序员编写类似"x{$user[$field]}"
的内容,因为变量$field
已使用字符串'serial'
正式初始化。
如果$user['serial'] == 5
,则最终结果为$_SESSION["x5"]
。
可以使用大括号将变量名括在双引号字符串中。例如,在这种情况下,它们很有用:
$sep = '--';
$str = "a{$sep}b";
// echo($str) will produce: a--b
在变量$sep
周围没有花括号,字符串看起来像"a$sepb"
,PHP在其中找到变量名$sepb
,因为不存在这样的变量,{{1变成$str
,这不是我们想要的。