网上搜索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,其中有这么几行代码。

”exit” {
return T_EXIT;
}

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

exit和die的区别的更多相关文章

  1. PHP中exit()与die()的区别

    PHP手册:die()Equivalent to exit(). 说明:die()和exit()都是中止脚本执行函数:其实exit和die这两个名字指向的是同一个函数,die()是exit()函数的别 ...

  2. php exit die的区别

    exit 输出一个消息并且退出当前脚本 void exit([string $status]) void exit(int $status)中止脚本的执行.尽管调用了exit(),Shutdow函数以 ...

  3. PHP中die()、exit()、return的区别

    1.die()是exit()的别名函数,用法与exit()完全相同,php手册上的说法是,“使用这种别名通常不是个好主意,因为这种别名可能会被完全废弃或更名,导致脚本难以移植到新版本的 PHP 上.” ...

  4. PHP中exit,exit(0),exit(1),exit('0'),exit('1'),die,return的区别

    die('1')  die()和exit()都是中止脚本执行函数:其实exit和die这两个名字指向的是同一个函数,die()是exit()函数的别名.该函数只接受一个参数,可以是一个程序返回的数值或 ...

  5. android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别

    android Activity类中的finish().onDestory()和System.exit(0) 三者的区别 Activity.finish() Call this when your a ...

  6. exit和_exit的区别

    参考 http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html p.p1 { margin: 0.0px 0.0px 0.0px ...

  7. iOS exit(),abort(),assert()函数区别

    iOS exit(),abort(),assert()函数区别 exit() 退出程序 abort() 停止程序, assert()检查里面的参数如果为nil抛出异常:

  8. break、continue、exit、return的区别和对比

    break.continue.exit.return的区别和对比 一:说明 break.continue在条件循环语句及循环语句(for.while.if等)中用于控制程序的走向:而exit则用于种植 ...

  9. PHP中return,exit,die的区别

    参考:die(),exit(),return的区别 1.die() 是遇到错误才停止,停止程序运行,输出内容(是程序级别的) 2.exit,exit():是一个函数 是停止程序运行,前者不输出内容:后 ...

随机推荐

  1. ABAP术语-Lock Object

    Lock Object 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/29/1085742.html Object type in the ...

  2. samba文件共享服务的配置

    samba文件共享服务的配置 服务端配置 一.安装samba软件包 命令:yum -y install samba 查看是否安装samba. [root@Centos7-Server haha]# [ ...

  3. BC追踪

    项目又要开始改造了,记录一下改造过程中碰到的坑和解决思路,避免以后回头看看自己的笔记都不知道写了什么. (一)敏感信息混淆 (二)活用ComponentScan (三)Swagger配置多项目共用 ( ...

  4. PHP 序列化与反序列化简单理解

    序列化就是把保存在内存中的各种对象状态,保存起来,在需要的时候还原出来. string serialize ,产生一个可以储存的表示 mixed unserialize 从已储存的表示中创建php值( ...

  5. YII2.0 获取当前访问地址/IP信息

    假设我们当前页面的访问地址是:http://localhost/CMS/public/index.php?r=news&id=1 一. 1.获取当前域名:echo Yii::app()-> ...

  6. hive 学习系列二(数据库的创建删除修改) 拿走,不谢。

    database 相当于一个目录或者命名空间,用来更好地进行表的管理 在hdfs 的目录位置大致如下: [root@iZbp12vtv76y9q3d633bh6Z /]# hadoop fs -ls ...

  7. python学习——基本数据类型

    一.运算符 1.算术运算: 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 二.基本数据类型 1.数字 1.1 整形数字和长整形数字:在32位机器上,整数的位数为32位,取值范围为-2**31 ...

  8. BZOJ3265: 志愿者招募加强版(线性规划)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 809  Solved: 417[Submit][Status][Discuss] Descriptio ...

  9. HBase 高级架构解析

    整体框架 使用 ZooKeeper 框架协助 RegionServer(类似于HDFS的nodemanager)用户请求从 Client 到 Zookeeper 进行判断数据属于哪一个 Region ...

  10. 深入理解计算机系统(1)--hello world程序的生命周期

    第一篇笔记的主题是讨论Hello World程序的生命周期,程序是最简单的hello world程序,使用高级C语言编写. 先介绍整个生命周期中涉及到的几个部分以及相应的概念,然后总结整个生命周期,最 ...