深入理解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.MVC的模板标签系统(一)
Sep 05 PHP
MySQL GBK→UTF-8编码转换
May 24 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
javascript实现的listview效果
2007/04/28 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
python实现kMeans算法
2017/12/21 Python
python Celery定时任务的示例
2018/03/13 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
如何打开WebSphere远程debug
2014/10/10 面试题
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技