最近在学php,在学到数组这一节时,遇到了一个令我困惑的问题:在双引号包围的字符串中引用对象(引用数组元素,因为php是动态语言,类型在运行中才确定),用单引号包围数组元素的索引值会导致php解析错误。代码如下:

代码部分

<?php
$arr = ["first" => "John","second" => "Tom", "third" => "Bob"];
echo "Hello, $arr[first]"; //correct
echo "Hello, {$arr[first]}"; //Warning: Use of undefined constant first - assumed 'first' (this will throw an Error in a future version of PHP) in /box/script.php on line 3
echo "Hello, {$arr['first']}"; //correct
echo "Hello, {$arr["first"]}"; //correct
//echo "Hello, $arr['first']"; //Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /box/script.php on line 7
//echo "Hello, $arr[\'first\']"; //Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /box/script.php on line 8
//echo "Hello, $arr["first"]"; //Parse error: syntax error, unexpected '"', expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /box/script.php on line 9
//echo "Hello, $arr[\"first\"]"; //Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /box/script.php on line 10
//echo "Hello, {$arr[\"first\"]}"; //Parse error: syntax error, unexpected '"first\"]}"' (T_CONSTANT_ENCAPSED_STRING), expecting identifier (T_STRING) in /box/script.php on line 11
//echo "Hello, {$arr[\'first\']}"; //Parse error: syntax error, unexpected ''first\']}"; //' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) in /box/script.php on line 12
//echo "Hello, $arr[]"; //Parse error: syntax error, unexpected ']', expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /box/script.php on line 13
?>

在思考一段时间后,我暂时找到了一个能够说服我自己的理由:在双引号包含的字符串中,php是按正则表达式来匹配变量的。
php中,单引号包围的字符串是纯字符串常量,不会匹配变量来进行解析操作,直接输出字符串的结果,例如:echo 'Hello, $arr[\'first\']';的输出结果就是“Hello, $arr['first']”,解析器不会把$开始字符串视作变量的引用;
而解析双引号包围的字符串时,会将字符串中以$开头的部分当作变量。并且是通过正则表达式的方式来匹配变量的,这个正则表达式我认为是下面这样的:

//匹配php变量的C#语法写法:
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\\$[_A-Za-z]+[\\[0-9A-Za-z\\]]*");
//通用写法
\$[_A-Za-z]+[\[0-9A-Za-z\]]*

下面是我询问chatGPT得到的回答:
问题:php解释器是通过正则表达式来匹配双引号中的变量吗?
答案:是的,PHP解释器在解析双引号字符串时,会通过正则表达式来匹配其中的变量。具体来说,它会查找字符串中以$开头、后面跟着一个或多个字母、数字或下划线的部分,并将其作为变量名解析。这个过程被称为变量插值(variable interpolation)。除了变量,双引号字符串中还可以包含一些特殊字符序列(比如\n、\t等),这些序列也会被解析为相应的字符。

最后修改:2023 年 08 月 04 日
如果觉得我的文章对你有用,请随意赞赏