深入理解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基础知识:函数基础知识
Dec 13 PHP
php基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
简单采集了yahoo的一些数据
Feb 14 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
php实现推荐功能的简单实例
Sep 29 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
session 加入redis的实现代码
2016/07/15 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
jquery键盘事件介绍
2011/01/31 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
node.js express框架简介与实现
2019/07/23 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
C#实现启动一个进程
2016/10/01 面试题
客房主管岗位职责
2013/12/09 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
市场营销工作计划书
2014/09/15 职场文书
四风问题对照检查材料
2014/09/22 职场文书
婚前协议书标准版
2014/10/19 职场文书
年度考核表个人总结
2015/03/06 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python