深入理解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和MySql中计算时间差的方法
Apr 22 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
javascript 节点遍历函数
2010/03/28 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
Django入门使用示例
2017/12/12 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
sklearn的predict_proba使用说明
2020/06/28 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
python如何将图片转换素描画
2020/09/08 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
请说出以下代码输出什么
2013/08/30 面试题
高分子材料与工程专业个人求职信
2013/12/15 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang