深入理解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 相关文章推荐
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
PHP PDOStatement::getColumnMeta讲解
Feb 01 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 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数据库类
2009/05/27 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
基于python指定包的安装路径方法
2018/10/27 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
如何教少儿学习Python编程
2020/07/10 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
大学生就业自荐信
2013/10/26 职场文书
建筑工程管理专业自荐信范文
2013/12/28 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2015年暑期见闻
2015/07/14 职场文书
护理心得体会范文
2016/01/22 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
解决vue中provide inject的响应式监听
2022/04/19 Vue.js