我只是注意到我可以使用 a 变量作为参数,像这样:$variable = "This's a string."; function('$variable')
,而不是像这样:function('This's a string');
。我可以明白为什么我不能做后者,但我不明白幕后发生的事情使第一个示例起作用。
3 回答
你听说过形式语言吗?解析器跟踪上下文,因此它知道预期的字符是什么,什么不是。
在您关闭已打开的字符串的那一刻,您将返回到打开字符串之前的上下文(即在本例中的函数调用的上下文中)。
相关的 php 内部代码是:
这些是使其工作的C 代码的相关部分。它们是 PHP 内部工作的一部分(尤其是 Zend 引擎)。
PHP 没有预料到任何事情,它真的逐个字符地读取所有内容,并且一旦在不允许出现的语义上下文中发现意外的 TOKEN,它就会发出解析错误。
在您的情况下,它读取令牌'This'
并且扫描仪匹配一个新字符串。然后它继续阅读s
,当它找到一个空格时,它将 变成s
一个常量。由于常量和先前找到的标记'This'
一起不会形成任何已知的减少(可能的减少在我上面给你的解析器链接中描述),解析器发出一个错误,如
意外的 T_STRING
正如您可以从该消息中推断出的那样,它实际上指的是它已经找到的东西(或它希望它找到的东西),所以实际上没有任何预期。
你的问题本身是错误的,因为变量中没有撇号(在变量的标识符中)。您可能在变量的 value中有一个撇号。不要混淆他们。值可以独立,没有变量:
<?php
'That\'s fine';
42;
(这是一个有效的 PHP 代码,它只是将这些值加载到内存中)
function('$variable') 不应该正常工作
" "
转义单引号内的字符
其中的字符''
不会转义单引号(他们不能自己转义!)。
使用""
还允许您将变量用作字符串的一部分,因此:
$pet = 'cat'
$myStory = "the $pet walked down the street"
function($pet)
是函数应该传递字符串的方式
像这样使用它
function('This\'s a string');