PHP基础 - 数组\对象

时间:2015-02-12 19:42:38

标签: php

我做了一个基本的测验。我不明白最后一部分: $_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']}"];

3 个答案:

答案 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,这不是我们想要的。