搜尋

首頁  >  問答  >  主體

php中的require到底是函数还是语法

我发现两种用法都可以require('functions.php')require 'functions.php',那么它在php中到底是语法还是函数呢?我们能否在自己写php插件时也实现这样的用法?也就是可以这样用my_custom 'parms'

PHPzPHPz2895 天前476

全部回覆(2)我來回復

  • 怪我咯

    怪我咯2017-04-10 14:25:35

    语法
    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);
    }

    回覆
    0
  • 迷茫

    迷茫2017-04-10 14:25:35

    require是 PHP 中的关键字。

    f()这样的用法并不意味着f是函数。例如,print('hi'也可以,但是 print 并非函数。

    回覆
    0
  • 取消回覆