PHP如何自然地预测变量中的撇号? - php

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

参考方案

您听说过formal languages吗?解析器跟踪上下文,因此,它知道什么是预期的字符,什么不是。

在关闭已经打开的字符串的那一刻,您将返回到打开字符串之前的上下文(在这种情况下,就是在函数调用的上下文中)。

相关的php内部代码段为:

the scanner将'和'之间的序列转换为不可分割的令牌。
the parser将各个不可分割的标记放入语义上下文中。

这些是使C code起作用的相关项。它们是PHP(特别是Zend Engine)内部工作的一部分。

PHP不会预料到任何事情,它实际上逐字符读取所有字符,并且一旦在不允许的语义上下文中找到意外的令牌,就会发出解析错误。

在您的情况下,它将读取令牌'This',而扫描程序将匹配新的字符串。然后继续读取s,当找到空格时,它将s变成constant。由于常量和先前找到的令牌'This'不会形成任何known reduction(可能的减少量已在我上面为您提供的解析器链接中进行了说明),因此解析器发出类似

意外的T_STRING

您可以从此消息中推断出,它实际上是指所发现的内容(或希望所发现的内容),因此实际上没有任何预期。

您的问题本身就是错误的,因为变量中没有撇号(在变量的标识符中)。您可能在变量的值中带有撇号。不要混淆他们。值可以独立存在,而无需变量:

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

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

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP-从最后一个循环中删除逗号 - php

我在循环时有一个PHP,如果是最后一个循环,我想从,中删除​​最后一个逗号echo '],'; while($ltr = mysql_fetch_array($lt)){ echo '['; echo $ltr['days']. ' ,'. $ltr['name…