深入理解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
PHP中require和include路径问题详解
Dec 25 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP如何使用Memcached
Apr 05 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
PHP批量删除jQuery操作
Jul 23 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
Yii框架布局文件的动态切换操作示例
Nov 11 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 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相关资料
2006/10/09 PHP
一些常用的php函数
2006/12/06 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
php接口隔离原则实例分析
2019/11/11 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
Django model序列化为json的方法示例
2018/10/16 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
竞选班长自荐书范文
2014/03/09 职场文书
诚信承诺书范文
2014/03/27 职场文书
房地产活动策划方案
2014/05/14 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
校园开放日新闻稿
2015/07/17 职场文书
《角的度量》教学反思
2016/02/18 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android