我发现两种用法都可以require('functions.php')和require 'functions.php',那么它在php中到底是语法还是函数呢?我们能否在自己写php插件时也实现这样的用法?也就是可以这样用my_custom 'parms'。
回复内容:
我发现两种用法都可以require('functions.php')和require 'functions.php',那么它在php中到底是语法还是函数呢?我们能否在自己写php插件时也实现这样的用法?也就是可以这样用my_custom 'parms'。
语法
Zend/zend_language_scanner.l"eval" {
return T_EVAL;
}
"include" {
return T_INCLUDE;
}
"include_once" {
return T_INCLUDE_ONCE;
}
"require" {
return T_REQUIRE;
}
"require_once" {
return T_REQUIRE_ONCE;
}
Zend/zend_language_parser.yinternal_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.cvoid 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);
}
require是 PHP 中的关键字。
f()这样的用法并不意味着f是函数。例如,print('hi'也可以,但是 print 并非函数。
相关标签:php
本文原创发布php中文网,转载请注明出处,感谢您的尊重!