我发现两种用法都可以require('functions.php')和require 'functions.php',那么它在php中到底是语法还是函数呢?我们能否在自己写php插件时也实现这样的用法?
                    
                    
                2 回答
                            慕哥9229398
                            
                                 
                            
                        
                        
                                                
                    TA贡献1877条经验 获得超6个赞
语法
Zend/zend_language_scanner.l
<ST_IN_SCRIPTING>"eval" {	return T_EVAL;
}
<ST_IN_SCRIPTING>"include" {	return T_INCLUDE;
}
<ST_IN_SCRIPTING>"include_once" {	return T_INCLUDE_ONCE;
}
<ST_IN_SCRIPTING>"require" {	return T_REQUIRE;
}
<ST_IN_SCRIPTING>"require_once" {	return T_REQUIRE_ONCE;
}Zend/zend_language_parser.y
internal_functions_in_yacc:
		T_ISSET '(' isset_variables ')' { $$ = $3; }
	|	T_EMPTY '(' variable ')'	{ zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
	|	T_INCLUDE expr 			{ zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
	|	T_INCLUDE_ONCE expr 	{ zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
	|	T_EVAL '(' expr ')' 	{ zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
	|	T_REQUIRE expr			{ zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
	|	T_REQUIRE_ONCE expr		{ zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
;Zend/zend_compile.c
void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) {
	zend_do_extended_fcall_begin(TSRMLS_C);
	{
		zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
		opline->opcode = ZEND_INCLUDE_OR_EVAL;
		opline->result_type = IS_VAR;
		opline->result.var = get_temporary_variable(CG(active_op_array));		SET_NODE(opline->op1, op1);		SET_UNUSED(opline->op2);
		opline->extended_value = type;		GET_NODE(result, opline->result);
	}
	zend_do_extended_fcall_end(TSRMLS_C);
}- 2 回答
 - 0 关注
 - 167 浏览
 
添加回答
举报
0/150
	提交
		取消
	