深入理解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 相关文章推荐
基于wordpress主题制作的具体实现步骤
May 10 PHP
destoon二次开发常用数据库操作
Jun 21 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
php的PDO事务处理机制实例分析
Feb 16 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
php模拟实现斗地主发牌
Apr 22 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
php实现学生管理系统
2020/03/21 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
python批量提取word内信息
2015/08/09 Python
详解Python爬虫的基本写法
2016/01/08 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python ansible服务及剧本编写
2017/12/29 Python
python+tkinter实现学生管理系统
2019/08/20 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
Python网页解析器使用实例详解
2020/05/30 Python
Python中的面向接口编程示例详解
2021/01/17 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
人资专员岗位职责
2014/04/04 职场文书
租房安全协议书
2014/08/20 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
毕业证代领委托书
2014/09/26 职场文书
新闻通讯稿模板
2015/07/22 职场文书
2019个人工作总结
2019/06/21 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL