https://mp.weixin.qq.com/s/Wsn4grDRxVIgMfu__E_oWQ

1、include

2、require

3、include_once

4、require_once

方法详解:

  1. include 语句包含并运行指定文件。

  2. require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR(编译致命错误 64 编译时致命性错。这就像由Zend脚本引擎生成了一个 E_ERROR。) 级别的错误。换句话说将导致脚本中止而 include只产生警告(E_WARNING),脚本会继续运行。

  3. include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

  4. require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

总结:

  1. include 和 require 语句都是包含并运行指定文件,不同的是处理失败的方式不同,所以一般 require 用于加载重要文件,比如加载框架的引导文件,如果出错将终止程序,include 一般用于加载配置文件或者第三方扩展库等,比如 composer 就是用的 include 加载文件的。

  2. include_once 和 require_once 语句与 include 和 require 语句的不同就是,如果该文件已经包含过就不会再次包含了,这在避免文件重复加载,函数重定义,变量重新赋值等问题上有用,但是一定程度上会有性能损耗问题,毕竟需要检查是否加载过。所以一般确定的情况下会优先使用 include 和 require ,而不是 include_once 和 require_once 语句。


实验

扩展知识:

包含文件的语句会受php.ini 和 include_path(;include_path = ".:/php/includes")配置项影响,相关函数:

  • ini_set() - 为一个配置选项设置值

  • set_include_path - 设置当前的 include_path 配置选项

  • get_include_path() - 获取当前的 include_path 配置选项

  • restore_include_path() - 还原 include_path 配置选项的值

  1. 直接引入(包含)文件默认是以上面set_include_path设置的目录为环境目录,环境目录找不到再从当前目录找

  2. / 表示服务器根目录,linux上面直接表示磁盘根目录,Windows下面表示某个磁盘根目录例如D:\\,realpath()可以返回绝对路径。

  3. ./ 表示当前运行文件的同级目录(入口),而不是当前脚本所在的目录(include 语句所在脚本文件的目录)

  4. 如果以相对于当前脚本文件引用文件请用__DIR__常量

注意:第一种情况,请小心了!这个一般表示从当前目录找,但是什么是当前目录呢?这个不同情况是不同的,它会先把当前运行文件的目录当成当前目录,如果找不到,再把当前脚本所在的目录当成当前目录,从当前脚本所在目录开始找,如果还找不到就报错,引入文件不存在。

所以如果意图清楚,最好是使用最后两种方式引入文件,这样能减少不必要的麻烦,另外使用绝对路径比使用相对路径加载文件性能更高,这样能避免系统去解析相对路径而耗费一些时间。

当前运行文件,当前脚本,请注意仔细理解它们的差别,前者作为入口运行,后者则被脚本通过引用的方式调用。魔术常亮\__FILE\__\__DIR\__ 就是后者的文件名(包含完整的绝对路径)和目录。


关于路径的其他引申

PHP脚本这种文件相互引用包含的关系可和网页中静态文件css中的../路径不同,css中的路径之和所在css文件url路径相关,和网页没有半毛钱关系,网页只是加载它而已,但是如果css中使用/那情况就不同了,一般/为根域名,再说一遍,静态文件中除了/其他的路径都是相对于当前静态文件的,和网页地址没有关系。网页中的.//则是相对于当前url路径(对于pathinfo也没有关系,不会受影响,认不出是假目录的)和根域。

还可以通过注册自动加载方法来实现自动加载,框架大部分都实现了自动加载,不然手动写包含语句不利于维护,太麻烦。

php四种文件加载语句的更多相关文章

  1. 13)PHP,文件加载(include和require)

    有四种文件加载的语法形式(注意,不是函数): include,  include_once,  require, require_once; 他们的本质是一样的,都是用于加载/引入/包含/载入一个外部 ...

  2. 小程序页面的四种文件(JSON、WXML、WXSS、JS)加载顺序

    一个小程序页面由四种文件组成: 1)json 页面配置文件 2)js 页面逻辑文件(必需) 3)wxml 页面结构文件(必需) 4)wxss 页面样式文件 这四个文件的加载顺序: 第一步: 加载页面j ...

  3. 插件化框架解读之so 文件加载机制(四)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 提问 本文的结论是跟着 System.loadlibrary() ...

  4. 两种动态加载JavaScript文件的方法

    两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...

  5. 软件光栅器实现(四、OBJ文件加载)

    本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...

  6. php基础知识(3)(文件加载include)

    文件加载 综述: 有4个文件加载的语法形式(注意,不是函数): include,  include_once,  require, require_once; 他们的本质是一样的,都是用于加载/引入/ ...

  7. 文件加载---理解一个project的第一步

    当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别 ...

  8. *.pro、*.pri、*.prf、*.prl等四种文件

      尽管每次和cmake对比起来,我们总是说 qmake 简单.功能少.但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧: 不是太清楚CONFIG等变量到底如何起作用的 用过的qmak ...

  9. [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件

    转自:http://blog.csdn.net/dbzhang800/article/details/6348432 简单介绍一下 *.pro.*.pri.*.prf.*.prl等四种文件:干嘛用的, ...

随机推荐

  1. 存储过程被程序和第三方客户端执行很慢,而sql server management studio执行速度正常

    来自:http://blog.csdn.net/pgbiao/article/details/22388945 原因分析:由于存储过程是预编译的, 在第一次执行的时候, 会生成执行计划, 以后执行的时 ...

  2. JS 变量的数据类型 运算符

    JS中变量的类型有:数值型.字符型.布尔型.undefined.null.array.object.function 1.数值型:可以进行算术运算的(加.减.乘.除) 数值型包括:整型(整数)和浮点型 ...

  3. python 集合(set)

    1.集合的创建 集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素. 创建集合:大括号或 set() 函数可以用来创建集合.注意:想要创建空集合,你必须使用 set() 而不是 {},后 ...

  4. 20.multi_case03

    # 多线程 import threading import time class myThread(threading.Thread): def __init__(self, threadID, na ...

  5. 「APIO 2019」奇怪装置

    题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...

  6. 【转载】Kafka介绍及升级经验分享

    http://blog.talkingdata.net/?p=3165 背景 当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kafka来做 ...

  7. 数据库DQL、DML、DDL及DCL详解

    目录 1. 数据查询语言(DQL,Data Query Language) 2. 数据操纵语言(DML,Data Manipulation Language) 3. 数据定义语言(DDL,Data D ...

  8. Python中else的用法

    Python中else除了可以与if组成条件语句外,还可以和while .for .try一起串联使用. else和while配合使用: count=0 while count>12: if ( ...

  9. JS流程控制语句 二选一 (if...else语句) 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时执行的代码}

    二选一 (if...else语句) if...else语句是在指定的条件成立时执行代码,在条件不成立时执行else后的代码. 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时 ...

  10. 跟我一起使用create-react-app脚手架搭建vw-layout解决方案

    之前也是看过大漠的vw适配Vue-cli,我自己写H5,还有使用vue做项目的时候,会搭建大漠博客中的那一套. 现在在github上面,看见了一位博主使用create-react-app也是用vw适配 ...