这里有新鲜出炉的 PHP 面向对象编程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
php 中 die() 与 exit() 的真正区别是什么因,我们百度一下发现 die 是退出并释放内存,exit 是退出但不释放内存了,那么真的是这样吗, 需要的朋友可以参考下
网上搜索 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 的问题,我想大家应该可以确定了,只是名字不同,效果都是一样的,没有所谓的卸不卸载内存的问题。
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() 这个名字。
- $fp = fopen("./readme.txt", "r") or die("不能打开该文件");
这种情况下,如果 fopen 函数被调用返回布尔值 false 时,die() 将立即终止脚本,并马上打印传递给它的字符串," 死前还能说一两句话 "。
来源: http://www.phperz.com/article/17/0805/340949.html