设为首页 收藏本站
查看: 492|回复: 0

[经验分享] 又一个php的error_handler引起的诡异问题

[复制链接]

尚未签到

发表于 2017-4-5 10:57:40 | 显示全部楼层 |阅读模式
  今天又发现一个很诡异的php问题,明明有个类在代码里写了被加载,总是报错说没有找到,错误日志也没有其他的信息。想来想去觉得很可能还是error_handler被重置导致的,因为代码是在phpunit里执行的,因此要确认很简单,在test方法之前执行一句reset_error_handler,然后再执行,看报错信息。果然报错信息不一样了,这回说的是LIB_ROOT这个常量没有定义。回头再来看这个过程是什么样的呢?很显然,require那个文件之后,由于LIB_ROOT不存在,因此报错了,报错到error_handler里,然后它返回了true让代码继续执行,接下来require别的文件,直到需要使用那个类时,才发现原来类不存在。
  注意一个如下形式的文件
  require_once('ClassA.php');class ClassB{function demo(){ClassA::abc();}}
  在php中其实分为两个阶段的,一个是编译阶段,这个阶段把文件编译成opcode,并把执行代码加到当前的执行序列之上。如果这个阶段出错的话,会进入error_handler,而error_handler如果被用户自定义了,也即使用了set_error_handler,那么很可能就直接return true,将这个错误给忽略了。那么造成的后果就是这个文件其实被没有被编译成opcode。
  而以上面的那个文件为例,php执行时,先编译这个文件,注意这个时候,它不会递归处理ClassA.php,只是将那一句记录为了一个方法调用而已。这个编译阶段完成之后,进入执行阶段,这个时候执行require_once('ClassA.php'),又进入了编译阶段。执行守之后再执行方法,如果require_once('ClassA.php')执行时出错,并且程序没有退出,那到到ClassA::abc执行时,就会报ClassA不存在了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360492-1-1.html 上篇帖子: PHP SOAP服务器端 C#客户端 下篇帖子: 用PHP输出静态页面的两种方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表