深入理解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中10个不常见却非常有用的函数
Mar 21 PHP
php采集时被封ip的解决方法
Aug 29 PHP
PHP中获取文件扩展名的N种方法小结
Feb 27 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
深入解析php中的foreach问题
Jun 30 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
Symfony控制层深入详解
Mar 17 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php分页函数示例代码分享
2014/02/24 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python创建和使用字典实例详解
2013/11/01 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
浅析python继承与多重继承
2018/09/13 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
区域销售经理职责
2013/12/22 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
走群众路线剖析材料
2014/10/09 职场文书
志愿者事迹材料
2014/12/26 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
学校学期工作总结
2015/08/13 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书