如何在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 { $$ = $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] 删除。
我来说两句