2

我只是注意到我可以使用 a 变量作为参数,像这样:$variable = "This's a string."; function('$variable'),而不是像这样:function('This's a string');。我可以明白为什么我不能做后者,但我不明白幕后发生的事情使第一个示例起作用。

4

3 回答 3

5

你听说过形式语言吗?解析器跟踪上下文,因此它知道预期的字符是什么,什么不是。

在您关闭已打开的字符串的那一刻,您将返回到打开字符串之前的上下文(即在本例中的函数调用的上下文中)。

相关的 php 内部代码是:

  • 扫描仪将 ' 和 ' 之间的序列转换为不可分割的 TOKEN。
  • 解析器将各个不可分割的标记放入语义上下文中。

这些是使其工作的C 代码的相关部分。它们是 PHP 内部工作的一部分(尤其是 Zend 引擎)。

PHP 没有预料到任何事情,它真的逐个字符地读取所有内容,并且一旦在不允许出现的语义上下文中发现意外的 TOKEN,它就会发出解析错误。

在您的情况下,它读取令牌'This'并且扫描仪匹配一个新字符串。然后它继续阅读s,当它找到一个空格时,它将 变成s一个常量。由于常量和先前找到的标记'This'一起不会形成任何已知的减少(可能的减少在我上面给你的解析器链接中描述),解析器发出一个错误,如

意外的 T_STRING

正如您可以从该消息中推断出的那样,它实际上指的是它已经找到的东西(或它希望它找到的东西),所以实际上没有任何预期

你的问题本身是错误的,因为变量中没有撇号(在变量的标识符中)。您可能在变量的 value中有一个撇号。不要混淆他们。值可以独立,没有变量:

<?php
'That\'s fine';
42;

(这是一个有效的 PHP 代码,它只是将这些值加载到内存中)

于 2012-01-03T09:28:30.460 回答
1

function('$variable') 不应该正常工作

" "转义单引号内的字符

其中的字符''不会转义单引号(他们不能自己转义!)。

使用""还允许您将变量用作字符串的一部分,因此:

$pet = 'cat'
$myStory = "the $pet walked down the street"

function($pet)是函数应该传递字符串的方式

于 2012-01-03T09:25:35.773 回答
0

像这样使用它

function('This\'s a string');

于 2012-01-03T09:17:42.253 回答