为什么 PHP 字符串中的所有单词都要加引号?

4
今天我发现了一个功能/bug,我很难理解发生了什么。
我们都知道在PHP中这样写:
echo 'hello';
print 'world';
echo gettype('test');

将返回以下内容:

hello
world
string

然而,直到今天我才意识到这一点:
echo hello;
print world;
echo gettype(hello);

将返回以下内容:

hello
world
string

这里发生了什么?在PHP编译过程中,为什么它会将任何单个单词视为字符串?这有一个名称吗?它有任何实用价值吗?
2个回答

7

如果PHP无法找到名为hello的函数或常量,则会将其视为字符串。然而,这是不好的实践,甚至被警告:

>php -r 'error_reporting(E_ALL|E_STRICT);echo gettype(blah);'
PHP Notice:  Use of undefined constant blah - assumed 'blah' in Command line code on line 1

因此,这个故事的寓意是在PHP中始终打开error_reporting(就像你应该在Perl中始终使用use strictuse warnings一样)。


4

如果你没有在引号(双引号或单引号)中包装一个“字符串”,解释器将尝试猜测并将其转换为字符串。我相信当你在error_reporting(E_ALL)下运行这段PHP代码时,你会看到一个提示。

Notice: Use of undefined constant string - assumed 'string' in Command line code on line 1

一个好的实践是在开发环境中始终将error_reporting设置为E_ALL,但请记住在生产环境中将其设置为更少的描述,您不希望人们在php出错时访问敏感信息(例如路径)。


好的,跟进一下:为什么PHP会“猜测”这个单词应该是字符串?我能找到的唯一不会将此类问题视为语法错误的语言是像Ruby和Python这样不使用变量指示符的语言。这只是PHP懒惰的又一个例子吗? - Daniel Nill
从不同角度看,有些人认为这是“程序员友好”的特性。但我认为编写良好的代码仍然是程序员的责任和心态,我们不应该过于依赖解释器来告诉我们代码可能存在问题的时候。此外,如果将error_reporting设置为E_ALL会抛出警告,这表明php并不是那么懒惰(有检查机制,而不是完全忽略)。 - Andreas Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接