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

查看方法:

image-20220625185528039

include/require

include/require方法的处理方式相同. 我们先看他们的区别, 再去看_once方法的区别.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bjPcQLE-1656157366388)(https://oss-blog.cdn.hujingnb.com/img/202206251901506.png)]

通过查找, includerequire的唯一区别, 就是当文件不存在的时候处理方式不同.

image-20220625191410651

再次查找, 对于二者的处理方式如图所示(这个报错文案确实是文件不存在时候的文案). 对于调用的两个方法作用如下:

  • php_error_docref: 抛出php级别错误. 因为这里抛出的warning级别, 故不会令脚本停止.
  • zend_throw_error: 抛出编译期异常, 会终止脚本执行.

因此, 通过比较看到, requireinclude的唯一区别, 就是当文件不存在的时候, require会终止脚本执行, include仅抛出warning错误.

这里在zend_throw_error方法中看到了下面注释, 其中提到当前无法将编译期错误转换为exception. 可能未来会支持??

image-20220625192403857

include_once/require_once

通过查看源码, include_once/require_once的区别, 与include/require一样, 都是在对待异常的处理上不同, 其他完全一样

结论

因此, includerequire的唯一区别, 就是当文件不存在的时候, require会终止进程, 而include不会.

啊, 这, 整两个如此相似的关键字真的好么, 如果说, 将require去掉, 然后通过include返回值来判断文件是否存在, 由调用者来判断是否要终止进程, 这样是否会更合理一些呢? 亦或者PHP的设计师们是出于其他方面的考虑?

原文地址: https://hujingnb.com/archives/837

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RESTful API规范

前言 我现在工作的公司是在毕业前实习的公司, 实习结束后直接转正, 因此也是我任职过的唯一一家公司. 在日常工作进行 HTTP 接口的开发时, 发现了一个疑惑, 只用到了POST和GET请求, 但我们知道 HTTP还有PUT/DELETE等等, 为什么不用呢? 并且, 接口的响应码也只有200, 接口是…

Golang 接口原理

问题 小提示, 若想直接查看原理, 可从接口原理开始查看. 有这样一段GO代码: func main() {var obj interface{}fmt.Printf("obj nil. %b\n", obj nil)type st struct{}var s *stobj sfmt.Printf("s nil. %b\n", s nil)fmt.Printf("obj nil. …

Docker kill 1无效

前言 我们在平常强制停用一个进程的时候, 会选择什么命令? 一般在测试使, 不考虑程序突然中断带来的影响, 直接使用kill -9 pid强制停止就行. 但是, 就在刚刚, 我启动了一个docker容器, 进入容器后执行命令kill -9 1没有任何效果??? 啊这, 为什么呀? 尝试 为了解释这个…

容器内存相关知识

这篇文章是我研究容器内存整理出的相关内容. 前后内容并没有上下文关系, 每个知识点都可以单独查看. 内存控制 使用这样的命令启动一个容器docker run -d -m 300M xxx. 可以限制容器使用的内存最大为300M. 那么docker是如何实现容器的内存限制呢? 其实是操作系统已经做好了…

三星识别文字_比亚迪电子助力三星Galaxy Note 10系列霸气首发!

三星有子初长成气宇轩昂 秀美俊逸减之一分则嫌柔增之一分则嫌赘2019年8月7日于纽约巴克莱发布Galaxy Note 10系列用简约 重构美三星Galaxy Note 10与Galaxy Note 10分别搭载了6.3英寸和6.8英寸的超感官全视曲面屏,均采用单摄挖孔屏,开孔位于屏幕正上方。…

lisp 设计盘形齿轮铣刀_机械设计基础——周转轮系传动比的计算

点击上方蓝色字体,关注我们15(视频来源于网络,仅供学习交流,侵权请联系删除)机械计重点学习指导机械原理全书重点提要轴的结构改错机械设计作业集01机械设计作业集02机械设计作业集答案机械原理作业集机械原理作业集答案轴的强度计算院校推荐…

b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气

也忘记了是从什么时候开始,B站开始公布自己的年度弹幕了,今年的年度弹幕排名前五的分别是:爷青回、武汉加油、有内味了、双厨狂喜、禁止套娃。话说今年真的是不容易啊,过年那段时间以及上半年不会忘记那一幕幕感人深邃的瞬间&…

css打印适应纸张_从生态平衡到打印机故障分析

生态平衡(ecological equilibrium)是指在一定时间内生态系统中的生物和环境之间、生物各个种群之间,通过能量流动、物质循环和信息传递,使它们相互之间达到高度适应、协调和统一的状态。也就是说当生态系统处于平衡状态时,系统内各组成成分之…

html5调用系统声音1s响一次_20款奔驰GLC260提车改柏林之声音响,音乐诉请,为爱发声!...

奔驰GLC车型在2020上半年可谓是风生水起,尤其是2020年1-5月份的豪华品牌SUV排名中,奔驰GLC车型以58982的销售量遥遥领先,同比增长了2%,奔驰GLC5月销量高达15275辆,再次打败老对手奥迪Q5L,夺得豪华SUV销量冠…

js排序的时间复杂度_冒泡排序最好时间复杂度为什么是O

展开全部冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会e68a8462616964757a686964616f31333433616161将最小或最大的元素“浮”到顶端,最终达到完全有序代码实现在冒泡排序的过程中…

kotlin将对象转换为map_将网站转换为Photoshop文档

WebToLayers是一款能够帮助大家将网页转换成图像格式的软件,能够Web页面转换成PNG,JPG以及PSD格式的图片。当网页转换为PSD的时候,网页的各个要素都会自动转换为相应的图层,使得大家能够对PSD格式的网页进行设计与管理。WebToLaye…

centos更换网卡后怎么更新配置_CentOS安装

服务器使用的Linux操作系统都使用了CentOS来进行安装,CentOS是一个开源的Linux发行版,具有很好的稳定性和更多的可扩展行。为了能够正常使用Docker,我们将使用CentOS7及以上版本。​下载地址:https://www.centos.org/download/ ​…

串口485接法图_rs485接口接线怎样操作?

展开全部RS485采用差分62616964757a686964616fe58685e5aeb931333365633939信号负逻辑,2V~6V表示“0”,- 6V~- 2V表示“1”。RS485有两线制和四线制两种接线,四线制是全双工通讯方式,两线制是半双工通讯方式…

centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权

刚收到在腾讯云申请的云服务器8台,现在准备分配给不同项目组来使用。为了确保系统及账号的安全,root账号不能直接给到他们。因为root的权限太大,任何的误操作就可能导致系统异常或者数据丢失找不回来。而且我们这是生产环境,账号会…

mongodb 导出txt_(干货)前端实现导出excel的功能

前言 导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成,我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href…

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解,本人也算略懂一二,所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想,CPU的主要成分是什么?是硅(Si),硅从那里来&am…

文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件

自动化出现的那一天起,就有了各种各样的工具来满足自动化的需要。无论是用于windows桌面自动化的简单工具,还是用于企业自动化大量任务的工具,它们都有自己的功能。UiPath就是这样的工具,在本文中,我们介绍一些非常基本…

linux挂载cifs磁盘_CentOS7.4_1708挂载CIFS报错

CentOS7.41708操作系统,Windows_Server2012做1TB的网络共享磁盘(没有域)。今天在项目做软件加密的部署,现场环境是Vsphere虚拟化需要用CIFS共享来传输文件、软件等。CRT、Putty等工具的传输工具无法传输字符集!CentOS操作系统终端界面无任务信…

bootstrap上传图片可实现查看上一张图片和下一张图片_如何实现像人民日报微信推文一样的的点亮效果?...

如何实现向人民日报微信推文一样的的点亮效果?有两种方法:方法一:就是使用代码在编辑器进行编辑emmmmmm这个方法贼麻烦,需要调至HTML模式……方法二:在现有编辑器模板下利用SVG动画进行编辑,因为点亮效果本…

python加载项向导_Python安装与环境变量的配置,Python安装向导

我下载的是Python2.7.17Python安装包下载地址:https://www.python.org/downloads/release/python-2717/根据实际的操作系统,安装合适的安装版本Python安装:1.双击下载包,进入Python安装向导。2.选择安装目录。博主安装目录为 D:…