PHP require/include 区别
前言
在PHP
中, 载入文件可以选择使用require
, 也可以使用include
, 那么那他们有什么区别呢? 看了网上的一些文章, 说他们使用场景不同, require
一般在文件开头引入文件, include
一般在函数中动态引入文件.
但是我觉得并不是这么简单, require
是作为语言结构(关键字)出现的, 关键字这玩意对于语言设计者来说一般都是越少越好, 关键字少了语言才简单嘛. 于是我决定深入到源码级别来康康他们的区别.
探究
通过查看, require/require_once/include/include_once
这几个方法翻译后是同一个c
函数ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER
.
如何拿到这个c
函数可看这篇文章: https://hujingnb.com/archives/836
查看方法:
include/require#
include/require
方法的处理方式相同. 我们先看他们的区别, 再去看_once
方法的区别.
通过查找, include
与require
的唯一区别, 就是当文件不存在的时候处理方式不同.
再次查找, 对于二者的处理方式如图所示(这个报错文案确实是文件不存在时候的文案). 对于调用的两个方法作用如下:
php_error_docref
: 抛出php
级别错误. 因为这里抛出的warning
级别, 故不会令脚本停止.zend_throw_error
: 抛出编译期异常, 会终止脚本执行.
因此, 通过比较看到, require
和include
的唯一区别, 就是当文件不存在的时候, require
会终止脚本执行, include
仅抛出warning
错误.
这里在zend_throw_error
方法中看到了下面注释, 其中提到当前无法将编译期错误转换为exception
. 可能未来会支持??
include_once/require_once#
通过查看源码, include_once/require_once
的区别, 与include/require
一样, 都是在对待异常的处理上不同, 其他完全一样
结论
因此, include
和require
的唯一区别, 就是当文件不存在的时候, require
会终止进程, 而include
不会.
啊, 这, 整两个如此相似的关键字真的好么, 如果说, 将require
去掉, 然后通过include
返回值来判断文件是否存在, 由调用者来判断是否要终止进程, 这样是否会更合理一些呢? 亦或者PHP
的设计师们是出于其他方面的考虑?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-06-25 如何将数字转换成口语中的文本串