深入理解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 Sql Server连接失败问题及解决办法
Aug 07 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
PHP中设置时区方法小结
Jun 03 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
浅析php header 跳转
Jun 17 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 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制作用户注册系统
2015/10/23 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
python实现神经网络感知器算法
2017/12/20 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
大学生的应聘自我评价
2013/12/13 职场文书
商务英语求职自荐信范文
2013/12/24 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python