加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:25:39 所属栏目:PHP教程 来源:网络整理
导读:PHP的工作原理如何: $myClass = 'AppMyClass';$object = new $myClass; 但这会导致错误: $myClass = 'MyClass';$object = new 'App'.$myClass; 在第二个示例中,抛出了一个意外的T_CONSTANT_ENCAPSED_STRING. 事实证明,上述例子是因为operator precedenc
PHP的工作原理如何:
$myClass = 'AppMyClass';
$object = new $myClass;

但这会导致错误:

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

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

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

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

$object = new 'AppMyClass';

抛出相同的错误.为什么是这样?

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相同,当它被介绍时).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读