先思考一个问题:

如下代码会向页面显示什么?

<?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);
?>

自己总结:

1、功能上,die() 就等同于 exit();

2、PHP有多种运行方式,即可网站形式,也可脚本形式(不需要Web服务器)。

  • 当PHP为脚本形式运行时,建议用exit():

比如说 Bash Shell脚本语言,当它要停止运行时,会用 exit()函数终止脚本,并允许输出点内容到运行环境(一般是存储到一个全局变量中),但输出的内容只能是 数字,表示“命令的结束状态”。

相关参考链接:http://blog.snsgou.com/post-711.html

也就是说,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的问题,我想大家应该可以确定了,只是名字不同,效果都是一样的,没有所谓的卸不卸载内存的问题。

https://blog.csdn.net/u011598153/article/details/38736699

https://www.cnblogs.com/superfeeling/p/4675676.html

PHP中exit()与die()的区别相关推荐

  1. linux脚本中的exit,Shell中exit和return的区别讲解

    1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程.使用格式如下: exit [] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异常退 ...

  2. Shell 中 exit 和 return 的区别

    1.exit 命令 exit 命令是 Shell 内建命令,用于退出当前 Shell 进程.使用格式如下: exit [N] 可以指定退出状态 N,N 的取值范围是 0-255,一般情况下,0 表示正 ...

  3. Linux编程中的坑——C++中exit和return的区别

    今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的: 写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样: [cpp] view plaincopy ...

  4. Linux中exit与_exit的区别

    在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...

  5. php 终止程序的方法——return、exit()、die()

    php中终止程序的运行有三种方式: return,主脚本程序中使用 exit(),脚本中使用 die(), 脚本中使用 三者所在的脚本文件他们之后的代码都不会执行了.php开发模式下想直接看到变量的值 ...

  6. PHP中终止程序输出的exit和die

    今天我们来看看如何终止程序,往往在项目开发中,你可能需要排查错误,这个时候,不希望后面的内容输出影响显示,可以用exit来进行程序的终止,也有die可以使用,而die在php官网上说语法结构等同于ex ...

  7. php exit 和die,PHP中的die()和exit()有什么区别?

    PHP中的die()和exit()函数有什么区别? 我认为两者都有相同的功能,但我怀疑两者有不同之处-它是什么? die()和exit()在其他语言中是不同的,但在php中,只需在.org/users ...

  8. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  9. linux中exit和fatal区别,关于Linux系统命令中exit与exit的区别

    关于Linux系统命令中exit与exit的区别 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和 ...

最新文章

  1. WCF wsHttpBinding之Transport security Mode, clientCredentialType=”Basic”
  2. c语言 写出raw文件,求指导,如何用c语言实现读取*.raw格式图像
  3. 通过命令行界面使用AWS ElasticMapReduce
  4. 阿里架构师进阶23期精讲:Redis、Kafka、Dubbo、Docker等
  5. 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
  6. scala写入mysql_spark rdd转dataframe 写入mysql的实例讲解
  7. 量化交易软件 python_我用Python做了个量化交易工具!
  8. 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
  9. 如何在CentOS系统服务器下搭建代理IP
  10. react组件设计原则_可靠React组件设计的7个准则之封装
  11. Springboot整合minio
  12. 怎么在计算机里隐藏文件,怎么显示电脑隐藏文件?
  13. 驾校学员信息管理系统
  14. 递归实现数组的扁平化
  15. 论文笔记 Object-Aware Instance Labeling for Weakly Supervised Object Detection - ICCV 2019
  16. Macbook Pro(MBP)上固态硬盘SSD,光驱位装HDD
  17. 基于VGG19的识别中国人、韩国人、日本人分类器
  18. python台风动图绘制_NCL绘制台风路径
  19. App软件开发的完整在线流程
  20. c语言开发网站教程,C语言也能干大事之C语言开发网站教程

热门文章

  1. IntelliJ IDEA2017 激活方法
  2. python必备常用英语词汇
  3. PTA 7-24 书香节
  4. 浮点型数据判断相等不能直接使用==
  5. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建
  6. Numpy 数组索引
  7. p8刷原生android,【EMUI3.1全局】原生Android M + IOS 7完美结合,听说跟P8更配哦
  8. 【selenium实例一】网易云歌单封面图片
  9. 如何将visio画的图转为eps格式?
  10. robotframework基础入门:(3):找不到关键字的对应方法