深入理解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 相关文章推荐
简单的页面缓冲技术
Oct 09 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
PHP可逆加密/解密函数分享
Sep 25 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP-FPM和Nginx的通信机制详解
Feb 01 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
Javascript UrlDecode函数代码
2010/01/09 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
python列表操作实例
2015/01/14 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
python抓取文件夹的所有文件
2018/02/27 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
python os模块在系统管理中的应用
2020/06/22 Python
某公司C#程序员面试题笔试题
2014/05/26 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
质检员的岗位职责
2013/11/15 职场文书
化学教师自荐信范文
2013/12/28 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
2014年建筑工作总结
2014/11/26 职场文书
车间质检员岗位职责
2015/04/08 职场文书
宿舍管理制度范本
2015/08/07 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书