深入理解PHP原理之错误抑制与内嵌HTML分析


Posted in PHP onMay 02, 2011

PHP提供了一个错误抑制符'@', 它是通过什么方式来阻止错误输出呢? 我又该在什么时候使用它呢?
这是这俩天一些网友提到的共同问题, 今天就索性整体回答下, 备后来人翻阅.
PHP文件内嵌HTML的处理方式
在PHP中, 所有在标签外的字符, 在词法分析过程中, 都会翻译成T_INLINE_HTML token, 在语法分析的时候, 所有的T_INLIE_HTML都会被分配ZEND_ECHO输出.
也就是说:

<?php 
while($con) { 
?> 
laruence 
<?php 
} 
?>

会生成一条OPLINE: T_ECHO, 而操作数是”laruence”;
就结果来说, 上面的代码, 其实和下面的结果一样:
<?php 
while($con) { 
echo "laruence"; 
} 
?>

但有一个要注意的地方是, 对于PHP标签外的字符, 在词法分析过程中, 都会以400个字符为单位切分, 比如:
<?php 
if(1) { 
?> 
laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence 
<?php 
} 
?>

上面的代码中, 标签外有531个字符(包含空格回车), 会被分成俩条T_INLINE_HTML输出.
错误抑制符
我们知道,在PHP中,可以通过错误抑制符来静默错误提示, 那么它是通过什么方式呢?
在语法分析的过程中, 对于:
<?php 
@include('file'); 
?>

会分别在include语句前后插入俩条Opline(操作), 这俩个操作分别做:
1. 保存当前的error_reporting值, 并设置error_reporting(0); //关闭错误输出 
2. 恢复之前保存的error_reporting值

也就是说, 其实上面的代码, 和下面的代码类似:
$old = error_reporting(0); 
include('file'); 
error_reporting($old);

另外, 讲一句题外话:”什么时候才应用错误抑制呢?”, 我个人建议, 就是如果这条语句出错了对你影响不大, 你也不关心这个错误是什么, 你也不会安排额外的逻辑来处理这种错误, 那么你可以使用错误抑制. 否则, 请你使用额外的逻辑来判断错误.
PHP 相关文章推荐
PHP中对数据库操作的封装
Oct 09 PHP
PHP一些有意思的小区别
Dec 06 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
学习php设计模式 php实现备忘录模式(Memento)
Dec 09 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
PHP中串行化用法示例
Nov 16 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 #PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 #PHP
PHP中使用gettext来支持多语言的方法
May 02 #PHP
php中神奇的fastcgi_finish_request
May 02 #PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 #PHP
PHP 调试工具Debug Tools
Apr 30 #PHP
php debug 安装技巧
Apr 30 #PHP
You might like
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
Python 错误和异常小结
2013/10/09 Python
快速入手Python字符编码
2016/08/03 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
详解重置Django migration的常见方式
2019/02/15 Python
详解Python用户登录接口的方法
2019/04/17 Python
django迁移数据库错误问题解决
2019/07/29 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
教育孩子心得体会
2014/01/01 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
4s店活动策划方案
2014/08/25 职场文书
考博导师推荐信范文
2015/03/27 职场文书
行政撤诉申请书
2015/05/18 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书