- 相干保举
PHP函数die()与exit()的真正区分
网上搜刮die与exit两个函数的区分,大局部的”规范谜底”都是说die是加入并开释内存,exit是加入但不开释内存。
另有人说exit()并不必然便能够或许够让法式竣事,由于能够或许利用由于能够或许利用register_shutdown_function注册一个或多个exit以后才履行的函数,并且另有工具的析构函数也会在exit以后履行。可是die()必然能竣事法式。
这个题目PHP官方给的谜底是两个函数感化同等。
“die — Equivalent to exit().This language construct is equivalent to exit(). ”二者只是又名干系,除此以外完整一样。
不过我仍是很好奇,决议从源码中找找线索,看看php是若何处置的这个“又名”。
起首要清晰一点,die和exit都是”language construct”而非函数,网上也有良多说某某某有前往值是函数,某某无前往值是布局,良多初学者总搞不清说话布局和函数的区分,用浅显点的话讲,说话布局能够或许懂得为语法自身的一种标识。像+、-、*、/这些也都是说话布局,if、else、for、while,这些都是说话布局。是语法自身的一局部。任何说话城市有这些工具,由于计较机看到+不会以为是应当做加法的。这须要编译器转换为机械码也便是cpu能够或许辨认的指令集。
php履行源码时的全部进程为,起首根据zend_language_scanner.l中界说的,将源码中的echo、if之类的说话布局转换成近似的T_ECHO、T_IF这些token,并且会去掉源码中的空格,正文这些与法式逻辑有关的字符。,就构成了一些冗长的抒发式,这便是词法阐发阶段。而后会根据zend_vm_opcodes.h中界说的,将这些token转换为op code。而后一条一行的履行这些op code。
上面大要诠释了php的编译和履行的进程,和说话布局的界说。上面进入正题。
咱们也应当记得,php中有良多又名函数,比方:implode和join。不管是又名函数仍是又名说话布局,从现实成果角度讲,都是一样的,不过源码的处置体例必定仍是不一样的。
咱们先看看这个又名说话布局是若何处置的,稍后再看又名函数。
zend_language_parser.c中,界说了一个宏
#define T_EXIT 300
还界说了一个enum,外面也有
enum yytokentype {
…
T_EXIT = 300,
….
}
这里告知咱们,T_EXIT这个token,它的code是300。
再看zend_language_scanner.l,此中有这么几行代码。
”exit” {
return T_EXIT;
}
”die” {
return T_EXIT;
}
很较着,php做词法阐发时,不管碰到exit仍是die,城市前往T_EXIT这个token。从这里便能够或许够证实,die和exit,再php外部处置是完整一样的。
也能够或许用以下php代码来肯定:
”));
前往的成果中die和exit对应的token code,都是300。
此刻对于die和exit的题目,我想大师应当能够或许肯定了,只是名字差别,成果都是一样的,不所谓的卸不卸载内存的题目。
【PHP函数die()与exit()的真正区分】相干文章:
PHP函数的区分及用法10-27
php经常使用的体系函数05-05
PHP类与机关函数07-01
PHP数组函数常识10-24
PHP函数常识总结09-29
PHP数据过滤函数09-05
PHP中php://input和$-POST的区分08-26
Java和PHP的区分09-09
php若何禁用eval函数06-12