PHP中exit()与die()的区别
先思考⼀个问题:
如下代码会向页⾯显⽰什么?
<?php
die(123);
>
曾经有段时间我⼀直认为 页⾯会显⽰ 123,但实践结果告诉我,答案错了,页⾯⼀⽚空⽩!
⼀直不知道为什么,死活不输出123,为了让页⾯输出123,我把它修改为如下代码:
<?php
echo '123';
die();
>
⽹上的⼀段资料:
PHP中exit()与die()的区别
PHP⼿册:die()Equivalent to exit()。
说明:die()和exit()都是中⽌脚本执⾏函数;其实exit和die这两个名字指向的是同⼀个函数,die()是exit()函数的别名。该函数只接受⼀个参数,可以是⼀个程序返回的数值或是⼀个字符串,也可以不输⼊参数,结果没有返回值。
参考:虽然两者相同,但通常使⽤中也有细微的选择性。例如:
当传递给exit和die函数的值为0时,意味着提前终⽌脚本的执⾏,通常⽤exit()这个名字。
echo "1111";
exit(0);
echo "2222"; // 22222不会被输出,因为程序运⾏到exit(0)时,脚本已经被提前终⽌,“马上断⽓”。
当程序出错时,可以给它传递⼀个字符串,它会原样输出在系统终端上,通常使⽤die()这个名字。
// 这种情况下,如果fopen函数被调⽤返回布尔值false时,die()将⽴即终⽌脚本,并马上打印
// 传递给它的字符串,“死前还能说⼀两句话”。
回到前⾯这个话题,下⾯代码为什么不输出 123 到页⾯?
<?php
die(123);
// 或 exit(123);
>php语言处理什么的
⾃⼰总结:
1、功能上,die() 就等同于 exit();
2、PHP有多种运⾏⽅式,即可⽹站形式,也可脚本形式(不需要Web服务器)。
当PHP为脚本形式运⾏时,建议⽤exit():
⽐如说 Bash Shell脚本语⾔,当它要停⽌运⾏时,会⽤ exit()函数终⽌脚本,并允许输出点内容到运⾏环境(⼀般是存储到⼀个全局变量中),但输出的内容只能是 数字,表⽰“命令的结束状态”。
也就是说,exit(123)只是输出⼀种运⾏状态123,⽽不是真的要向控制台输出字符串 123。如果要向控制台输出123,代码得改成如下形式:
<?php
exit('123');
>
当PHP为⽹站形式运⾏时,建议⽤die():
但此时 die(数字),就没啥意义,因为它不会向页⾯输出 数字 字符串,也就是说,如果想让页⾯终⽌并且输出数字的话,得改成如下形式
<?php
die('123');
>
⽹上搜索die与exit两个函数的区别,⼤部分的”标准答案”都是说die是退出并释放内存,exit是退出但不释放内存。
这个解释显然是错的,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,其中有这么⼏⾏代码。
<ST_IN_SCRIPTING>”exit” {
return T_EXIT;
}
<ST_IN_SCRIPTING>”die” {
return T_EXIT;
}
很明显,php做词法分析时,⽆论遇到exit还是die,都会返回T_EXIT这个token。从这⾥酒可以证明,die和exit,再php内部处理是完全⼀样的。
也可以⽤下列php代码来确定:
<?php
var_dump(token_get_all(“<?php die;exit;?>”));
返回的结果中die和exit对应的token code,都是300。
现在关于die和exit的问题,我想⼤家应该可以确定了,只是名字不同,效果都是⼀样的,没有所谓的卸不卸载内存的问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论