PHP中include和require的使用详解

admin3年前PHP教程29

在PHP中,有两种包含外部文件的方式,分别是include和require。他们之间有什么不同呢?

如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行。而include只产生警告,脚本会继续执行。

这就是它们最主要的区别,其他方面require基本等同于include。

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找如果定义了路径不管是绝对路径还是当前目录的相对路径 include_path 都会被完全忽略include_path 在php.ini中定义当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域

除了普通的require和include之外,还有require_once和include_once,他们的作用是:

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

我们来看些例子:


// a.php 不存在
include "a.php"; // warning
// require "a.php"; // error
 
echo 111; // 使用include时111会输出
 
// file1.php 中只有一行代码echo 'file1';
require_once 'includeandrequire/file1.php'; // file1
require_once 'includeandrequire/file1.php'; // noting
 
include_once 'includeandrequire/file1.php'; // noting
include_once 'includeandrequire/file1.php'; // noting
 
require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1
 
require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1

我们可以看出当第一个_once加载成功后,后面不管是require_once还是include_once,都不会再加载这个文件了。而不带_once的则会重复加载文件。


file2.php
 
<?php
 
echo 'file2:' . $a, PHP_EOL;
echo 'file2:' . $b, PHP_EOL;
$b = "file2";
 
myFile.php
 
<?php
 
$a = 'myFile';
$b = 'youFile';
require_once 'includeandrequire/file2.php';
echo $a, PHP_EOL;
echo $b, PHP_EOL;
 
// 输出结果
// file2:myFile
// file2:youFile
// myFile
// file2
 
file3.php
<?php
 
$c = 'file3';
 
myFile.php
<?php
function test(){
    require_once 'includeandrequire/file3.php';
    echo $c, PHP_EOL; // file3
}
test();
echo $c, PHP_EOL; // empty

被包含文件中可以获取到父文件中的变量,父文件也可以获得包含文件中的变量,但是,需要注意_once的一个特殊情况。


function foo(){
    require_once 'includeandrequire/file3.php';
    return $c;
}
 
for($a=1;$a<=5;$a++){
    echo foo(), PHP_EOL;
}
 
// file3
// empty
// empty
// empty
// empty

使用_once并循环加载时,只有第一次会输出file3.php中的内容,这是为什么呢?因为现在的变量范围作用域在方法中,第一次加载完成后,后面的的文件不会再被加载了,这时后面四次循环并没有$c被定义,$c默认就是空值了。

如果两个方法中同时用_once加载了一个文件,第二个方法还会加载吗?


function test1(){
    require_once 'includeandrequire/file1.php';
}
function test2(){
    require_once 'includeandrequire/file1.php';
}
test1(); // file1
test2(); // empty

抱歉,只有第一个方法会加载成功,第二个方法不会再次加载了。

那么,我们在日常的开发中,使用哪个更好呢?

从效率来说,_once需要验证是否已经加载过文件,效率会低一些,但是并不是绝对的,甚至是我们肉眼不可见的降低,所以可以忽略它的效率问题。而它带来的好处则比不带_once的多得多本着错误提前的原则,使用require_once更好。因为将PHP报错级别调整为不显示警告后,include的警告信息会不可见,会带来不可预知的错误在方法中使用时,不应该用_once来加载文件,特别是这个文件需要在多个类或者方法中使用时,使用_once可能会导致后面的方法中无法载相同的文件使用require或include时,最好不要用括号,虽然的确可以这么使用,如 include ('xxx.php'); 它们是表达式关键字,不是系统方法,所以直接用 include 'xxx.php' 即可

include和require的文件如果有return,可以用变量接收retun回来的数据,另外它们还可以加载非PHP文件以及远程文件(远程加载需要确定php.ini中的allow_url_include为On),如:


file4.php
<?php
 
return 'file4';
 
file4.txt
可以吧
 
myFile.php
<?php
$v = require 'includeandrequire/file4.php';
echo $v, PHP_EOL; // file4
 
include 'includeandrequire/file4.txt';
// 可以吧
 
include 'baidu/index';
// 百度首页的html代码

这下我们对于include和require的了解就非常深入了吧,这两个加载文件的方式并不复杂,但也很容易出现一些坑,特别是_once在方法中使用的时候一定要特别注意。最后,给一个小福利,封装一个一次性加载目录中所有文件的方法:


function include_all_once ($pattern) {
    foreach (glob($pattern) as $file) {
        require $file;
    }
}
 
include_all_once('includeandrequire/*');

测试代码:github/zhangyue050…

以上就是PHP中include和require的使用详解的详细内容,更多关于PHP include和require的使用的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

防火墙的作用体现在哪里?100G美国高防服务器如何防御网络攻击?

对于任何规模的企业来说,网络安全都是最紧迫的问题之一。主动防御是保护用户的业务数据和运营免受基于网络的攻击的唯一方法之一。监控网络流量以识别和阻止潜在威胁的防火墙应该是用户企业网络安全基础设施的基础。...

Thinkphp6.0中间件的具体使用

目录全局中间件 应用中间件 路由中间件 控制器中间件 中间件传参 6.0中间件分为系统中间件和应用中间件,系统中间件为核心框架内置的中间件,应用中间件是在应用里面创建的中间件。中间件的主要应用场景可以...

gpu服务器能做图形渲染租用美国gpu服务器配置推荐参数

gpu服务器能做图形渲染?GPU即图形处理器,又称显示核心、视觉处理器、显示芯片,是一种专门用做图像和图形相关运算工作的微处理器。GPU服务器是基于GPU的应用于视频编解码、深度学习、科学计算等多种场...

PHP的bz2压缩扩展工具详解

在日常的开发和电脑使用中,我们经常会接触到压缩和解压的一些工具,PHP 也为我们准备了很多相关的操作扩展包,都有直接可用的函数能够方便的操作一些压缩解压功能。安装扩展这个扩展的安装需要系统有 bzip...

PHP并发场景的三种解决方案代码实例

在秒杀,抢购等并发场景下,可能会出现超卖的现象,在 PHP 语言中并没有原生提供并发的解决方案,因此就需要借助其他方式来实现并发控制,其实方案有很多种,今天只是举个栗子抛砖引玉,有其他更好的方案你可以...

PHP获取学生成绩的方法

本文主要练习一下如何利用php完成一个简单的案例,即输入学生学号,得到相应的成绩信息。在此之前先来认识一下这个非常重要的语法get请求:参数在url后面,多个参数用&进行连接$_get[ ]&...