pupuk / blog

My New Blog. Record & Share. Focus on PHP, MySQL, Javascript and Golang.
MIT License
9 stars 2 forks source link

再谈PHP中引入文件 require,include,require_once,include_once区别? #3

Open pupuk opened 6 years ago

pupuk commented 6 years ago

老生常谈的问题,在面试的时候,经常也发现很多小伙伴还是没有理解清楚,估计有两方面的原因。 一是通过百度搜索出来的资料,鱼目混杂,良莠不齐,有的地方还有错误。 二是小伙伴可能被业务需求占用的过多的时间,没有认真思考这个问题,没看PHP官方文档,没有做实验。

再此记录一下也是帮助别人,提醒自己。

官方文档:requireinclude 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR (注: 是fatal error)级别的错误,换句话说将导致脚本中止。而 include 只产生警告(E_WARNING),脚本会继续运行。

image1 image2 image3 image4

require一个不存在的文件,会产生fatal error,中断脚本。

有once的情况 官方文档:require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含,这也比较容易理解。

image5

test.php及其运行结果

image6 image7 image8 image9

要点: 这四个都是语句(statement),不是函数(function),所以推荐使用语句写法,不推荐函数式的写法:如 require(‘target.php’);

反而推荐 require 'target.php';

目前主流的框架,laravel,Yii等引入文件时候,使用的最多的是:require,其次是:require_once includeinclude_once较少使用。

补充: 这四个语句,对待被引入文件的逻辑顺序是: 1、如果是路径(绝对路径[win下的\ 和linux的/] ,相对路径[ . 或者 ..]),优先使用路径查找。 2、只有文件名的情况,去 include_path 环境变量的目录查找 3、只有文件名的情况,如果在include_path目录中没有找到,在文件所在目录和当前工作目录下查找。 4、仍未找到,include系列抛出warning,脚本继续运行。require系列抛出 fatal error,中断脚本。