深入理解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 相关文章推荐
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
PHP中extract()函数的定义和用法
Aug 17 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP中常用的魔术方法
Apr 28 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
brook javascript框架介绍
2011/10/10 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
Python 实现网页自动截图的示例讲解
2018/05/17 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
党委书记岗位职责
2013/11/24 职场文书
百度吧主申请感言
2014/01/12 职场文书
护士自我评价
2014/02/01 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang