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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了为什么可以从一个字符串变量实例化一个类,但不是PHP中的一个字符串?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
PHP的工作原理如何:
$myClass = 'App\MyClass';
$object = new $myClass;

但这会导致错误

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

在第二个示例中,抛出了一个意外的T_CONSTANT_ENCAPSED_STRING.

事实证明,上述例子是因为operator precedence,因为新的最高优先级,但…

同样,我可以尝试用一个字符串进行实例化,如:

$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,$3); }
    |   new_variable T_OBJECT_operaTOR proPErty_name
            { $$= zend_ast_create(ZEND_AST_PROP,$3); }
    |   class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable
            { $$= zend_ast_create(ZEND_AST_statIC_PROP,$3); }
    |   new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable
            { $$= zend_ast_create(ZEND_AST_STATIC_PROP,$3); }
// Copyright (c) 1998-2015 Zend TechnoLOGies Ltd.,the Zend license 2.00

这是为什么你不能在那里有字符串表达式. (它从未被扩展,因为简单的实例和$classvarnames通常是足够的,所以允许的语法大体上与PHP3相同,当它被介绍时).

脚本宝典总结

以上是脚本宝典为你收集整理的为什么可以从一个字符串变量实例化一个类,但不是PHP中的一个字符串?全部内容,希望文章能够帮你解决为什么可以从一个字符串变量实例化一个类,但不是PHP中的一个字符串?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。