为什么可以从字符串变量而不是PHP中的字符串实例化类?

萨姆拉普

如何在PHP中起作用:

$myClass = 'App\MyClass';
$object = new $myClass;

但这会导致错误:

$myClass = 'MyClass';
$object = new 'App\\'.$myClass;

在第二个示例中,unexpected T_CONSTANT_ENCAPSED_STRING抛出。

事实证明,以上示例归因于运算符优先级,因为new它具有最高优先级,但是...

同样,我可以尝试仅使用一个字符串实例化,如下所示:

$object = new 'App\MyClass';

并引发相同的错误。为什么是这样?

马里奥

PHP的语法在zend_language_parser.y中定义,并且它根本没有为new运算符定义任何更复杂的表达式

new_expr:
    T_NEW class_name_reference ctor_arguments
            { $$ = zend_ast_create(ZEND_AST_NEW, $2,  }
    |   T_NEW anonymous_class
            { $$ = $2; }

在哪里class_name_reference

class_name_reference:
        class_name      { $$ = $1; }
    |   new_variable    { $$ = $1; }

new_variable允许一组有限的变量表达式:

new_variable:
        simple_variable
            { $$ = zend_ast_create(ZEND_AST_VAR, $1); }
    |   new_variable '[' optional_expr ']'
            { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
    |   new_variable '{' expr '}'
            { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
    |   new_variable T_OBJECT_OPERATOR property_name
            { $$ = zend_ast_create(ZEND_AST_PROP, $1, $3); }
    |   class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable
            { $$ = zend_ast_create(ZEND_AST_STATIC_PROP, $1, $3); }
    |   new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable
            { $$ = zend_ast_create(ZEND_AST_STATIC_PROP, $1, $3); }
// Copyright (c) 1998-2015 Zend Technologies Ltd., the Zend license 2.00

这就是为什么您不能在那里有字符串表达式的原因。(它从未被扩展,因为琐碎的实例化和$ classvarnames通常就足够了。因此,允许的语法与引入PHP3时的语法基本相同。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在PHP中为类变量定义连接字符串?

来自分类Dev

为什么字符串文字不是字符串?

来自分类Java

Java从字符串实例化类

来自分类Dev

从字符串实例化Kotlin类

来自分类Dev

Ruby - 从字符串在类方法中设置实例变量

来自分类Dev

如何从Rails中的名称字符串实例化类?

来自分类Dev

如何在JavaScript中从字符串实例化类

来自分类Dev

为什么字符串不是值?

来自分类Dev

如果值是变量而不是字符串,为什么PHP in_array()返回false?

来自分类Dev

PHP类扩展字符串变量

来自分类Dev

为什么String引用变量在Java中存储字符串而不是地址?

来自分类Dev

在PHP中基于字符串动态实例化一个类

来自分类Dev

是否可以从PHP中的字符串创建变量?

来自分类Dev

在C#中,如果(字符串)类名称已知,如何从该(字符串)类实例化对象?

来自分类Dev

Dart-返回字符串,而不是类的实例

来自分类Dev

为什么我的 for 循环返回字符而不是字符串

来自分类Dev

为什么C ++ 11字符串新函数(stod,stof)不是字符串类的成员函数?

来自分类Dev

为什么可以将字符串指针初始化为字符串文字,而不是数组?

来自分类Dev

Clojure:通过实例变量或字符串(不是类名符号)调用Java静态方法/字段

来自分类Dev

为什么在某些情况下php无法在字符串模板中显示变量?

来自分类Dev

如何从字符串变量中指定类的特定实例

来自分类Dev

通过什么语言设计原则将字符串实例化为 GNU Octave 中的字符串或变量?

来自分类Dev

当我使用变量而不是整数或字符串时,为什么初始化日期对象失败?

来自分类Dev

涉及多个值/字符串时的类实例化

来自分类Dev

Phaser:通过字符串引用实例化类

来自分类Dev

为什么Django的related_model属性返回字符串而不是Model实例?

来自分类Dev

为什么这个分割字符串的 SQL 使用逗号分隔的字符串而不是空格分隔的字符串?

来自分类Python

您可以使用字符串实例化类吗?

来自分类Dev

为什么键入错误:<string>中的字符串要求字符串作为左操作数,而不是列表

Related 相关文章

  1. 1

    为什么我不能在PHP中为类变量定义连接字符串?

  2. 2

    为什么字符串文字不是字符串?

  3. 3

    Java从字符串实例化类

  4. 4

    从字符串实例化Kotlin类

  5. 5

    Ruby - 从字符串在类方法中设置实例变量

  6. 6

    如何从Rails中的名称字符串实例化类?

  7. 7

    如何在JavaScript中从字符串实例化类

  8. 8

    为什么字符串不是值?

  9. 9

    如果值是变量而不是字符串,为什么PHP in_array()返回false?

  10. 10

    PHP类扩展字符串变量

  11. 11

    为什么String引用变量在Java中存储字符串而不是地址?

  12. 12

    在PHP中基于字符串动态实例化一个类

  13. 13

    是否可以从PHP中的字符串创建变量?

  14. 14

    在C#中,如果(字符串)类名称已知,如何从该(字符串)类实例化对象?

  15. 15

    Dart-返回字符串,而不是类的实例

  16. 16

    为什么我的 for 循环返回字符而不是字符串

  17. 17

    为什么C ++ 11字符串新函数(stod,stof)不是字符串类的成员函数?

  18. 18

    为什么可以将字符串指针初始化为字符串文字,而不是数组?

  19. 19

    Clojure:通过实例变量或字符串(不是类名符号)调用Java静态方法/字段

  20. 20

    为什么在某些情况下php无法在字符串模板中显示变量?

  21. 21

    如何从字符串变量中指定类的特定实例

  22. 22

    通过什么语言设计原则将字符串实例化为 GNU Octave 中的字符串或变量?

  23. 23

    当我使用变量而不是整数或字符串时,为什么初始化日期对象失败?

  24. 24

    涉及多个值/字符串时的类实例化

  25. 25

    Phaser:通过字符串引用实例化类

  26. 26

    为什么Django的related_model属性返回字符串而不是Model实例?

  27. 27

    为什么这个分割字符串的 SQL 使用逗号分隔的字符串而不是空格分隔的字符串?

  28. 28

    您可以使用字符串实例化类吗?

  29. 29

    为什么键入错误:<string>中的字符串要求字符串作为左操作数,而不是列表

热门标签

归档