我想在heredoc中使用一个类常量,该常量在注释中使用,但这给了我一个错误。
class Example {
#[MyAnnotation(schema:<<<YAML
type: {${MyOtherClass::A_CONSTANT}}
YAML)]
function myFunction() {}
}
结果:
PHP Fatal error: Constant expression contains invalid operations
这看起来类似于 另一个heredoc问题,但作为一个const值,这应该在编译时可用。
我找不到任何关于为什么这不起作用的信息。我很高兴能找到遇到类似问题的人的线索,或者找到一种更优雅的方式来编写 JSONSchema,而无需链接多个heredocs。当然,我可以只使用字符串。
为什么类常量可以在普通表达式中的heredoc中使用,但不能在注释中使用。
这是我当前在 PHP 8.1 中的解决方法:
class Example {
#[MyAnnotation(schema:<<<YAML
type:
YAML . MyOtherClass::A_CONSTANT)]
function myFunction() {}
}
这在现有的语言中是不可能的。有关于字符串插值更改的讨论(请参阅评论),但不是我认为可能的风格。
许多其他语言使用 ${foo} 样式字符串插值,最显着的是 bash 和 JavaScript(在模板文本中)。然而,它的行为与 PHP 中的行为不同。在 PHP 中,该语法意味着变量。在 JavaScript 中,它支持任意表达式 2)。在目前的形式中,[美元符号后的大括号(“${foo}”)]和[变量]的用途有限,并且会让其他附近语言的用户感到困惑,因为它们的行为完全不同。
这也是我困惑的来源。