PHP如何处理未定义的常数



我正在使用 php 7.0.2

考虑以下来自PHP手册的文本:

为什么 $ foo [bar] 错误?

始终在字符串文字数组索引周围使用引号。例如, $ foo ['bar'] 是正确的,而 $ foo [bar] 不是。但为什么?是很常见 在旧脚本中遇到这种语法:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

这是错误的,但是有效。原因是该代码具有 未定义的常数(bar)而不是字符串('bar' - 注意 引号)。它之所以起作用,是因为PHP自动转换A 裸字符串(一个 未引用的字符串与任何已知符号不符) 字符串包含裸字符串。例如,如果没有 定义的常数命名 bar ,然后PHP将替换为字符串 'bar'并使用它。

从上面的文本中,我尚不清楚当PHP遇到bar()时,它与任何已知的符号(即未定义的常数)相对应时,PHP实际上对其进行了什么?

php如何将裸字符串 bar转换为包含裸字符串的字符串,即 'bar'

PHP是否定义标题为bar并为其分配字符串值'bar'

喜欢bar = 'bar';

如果是,我可以在其他代码中使用常数bar吗?

因为在PHP中只有一个变量和常数可以包含值/保持值,而不是像字符串一样包含/保留任何值。

从上面的文本中,我不清楚php遇到的bar(),它与任何已知符号(即未定义的常数)相对应时,php实际上对此有什么作用?

与此行为相关的警告确实说明了一切:

Warning: Use of undefined constant bar - assumed 'bar' (this will throw an Error in a future version of PHP)

裸词被视为字符串,而不是常数 - 它的对待就像您写的'bar'一样。表达式defined('bar')仍然是错误的,代码中bar的其他实例也会发出警告,取决于此行为的代码将停止在未来版本的PHP中完全工作。

bareword to String的后备文字在php 7.2中删除,并在php 8.0中删除:https://3v4l.org/ct1ie

<?php
var_dump(Y);
var_dump(date(Y));
  • 8.0.0-8.0.28,8.1.0-8.1.16,8.2.0-8.2.0-8.2.3
  • 的输出
Fatal error: Uncaught Error: Undefined constant "Y" in /in/cT1ie:3
Stack trace:
#0 {main}
  thrown in /in/cT1ie on line 3
Process exited with code 255.
  • 输出7.2.0-7.2.34,7.3.0-7.3.33,7.4.0-7.4.4.33
Warning: Use of undefined constant Y - assumed 'Y' (this will throw an Error in a future version of PHP) in /in/cT1ie on line 3
string(1) "Y"
Warning: Use of undefined constant Y - assumed 'Y' (this will throw an Error in a future version of PHP) in /in/cT1ie on line 4
string(4) "2023"
  • 4.3.0-4.3.11,4.4.0-4.4.9,5.0.0-5.0.5,5.1.0-5.1.0-5.1.6,5.2.0-5.2.0-5.2.17,5.2.17,5.3.0-5.3。
Notice: Use of undefined constant Y - assumed 'Y' in /in/cT1ie on line 3
string(1) "Y"
Notice: Use of undefined constant Y - assumed 'Y' in /in/cT1ie on line 4
string(4) "2023"

来自https://wiki.php.net/rfc/deprecate-bareword-sning:

当php遇到一个无引用的令牌(例如frob_active)时,它试图将其解析为内置或用户定义的常数,但是如果不存在这样的常数,它将其视为等同于引用的字符串'frob_active',并将其视为发出e_notice消息。自早期版本的PHP版本就已经存在,但与其余的语言不一致,并且可能导致严重的错误。该RFC提出了三件事:将消息的水平提高到e_warning;正式贬低后卫;并在php 8.0中删除它。

及其讨论:https://externals.io/message/98025

是否有另一种方法可以在php中写下字符串文字(没有'或quot")?

最新更新