为什么heredoc中不允许使用类常量?

问题描述 投票:0回答:1

我想在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() {}
}
php annotations heredoc class-constants
1个回答
0
投票

这在现有的语言中是不可能的。有关于字符串插值更改的讨论(请参阅评论),但不是我认为可能的风格。

许多其他语言使用 ${foo} 样式字符串插值,最显着的是 bash 和 JavaScript(在模板文本中)。然而,它的行为与 PHP 中的行为不同。在 PHP 中,该语法意味着变量。在 JavaScript 中,它支持任意表达式 2)。在目前的形式中,[美元符号后的大括号(“${foo}”)]和[变量]的用途有限,并且会让其他附近语言的用户感到困惑,因为它们的行为完全不同。

这也是我困惑的来源。

© www.soinside.com 2019 - 2024. All rights reserved.