PHP基本数组对象


PHP basic - arrayobjects

我正在做一个基本的测验。我不明白最后一部分:$_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",这不是我们想要的。