开发者学堂课程【PHP 基础入门课程(下):文件包含区别】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/710/detail/12649
文件包含区别
内容介绍:
一、incude 和 require 的区别
二、与_once 的区别
三、小结
一、incude 和 require 的区别
示例:
⑴被包含文件:data.php
function display ( ){
echo _FUNCTION__;
}
⑵include 和 require 的区别
include 包含不存在文件
include 'd.php';
#报错
echo 'hello world';
#输出 he11o world
require 包含不存在文件
require 'd.php';
#报错
echo 'hello world';
#没有输出
1.include 找不到文件报警告错误,不影响后续代码的继续执行
<?php
#业务逻辑处理
#获取数据(自己处理或者从其他地方拿到数据)
include '50data.php';
#文件包含 require 和 include 区别(找不到文件)
include 'test.php';
echo‘我还能抢救一下!’;
#逻辑处理:权限判定、安全、操作正确性
#显示数据
// require_once '51list.html';
那么它到底能不能输出?
首先把 require_once '51list.html'
注释掉,否则后面会一直报错显示没这个变量。那么50data.php 这个文件是存在的,test.php 这个文件是不存在的。
那么 test.php 报错的时候,影不影响 echo‘我还能抢救一下!’?
运行结果:Warning: include(test. php): failed to open stream: No such file or directory in
D:
\server\Apache24\htdocs\52controller.php on line 10
Warning:
include0ailled opunlng itosti pip forinalision (include_path=';CAphp\pear) in
D:
server\Apache24Nhtdocs\52controller.php on line 10
这个告诉我们找不到这个文件,但是还能抢救一下。
这说明 include 只是警告错误,不影响后续发展。
当然,如果后续应用很多东西都依赖这个文件的话,那这种东西要在事先开发的时候就处理掉。
2.require 找不到文件报致命错误,后续代码终止执行
<?php
#业务逻辑处理
#获取数据(自己处理或者从其他地方拿到数据)
include '50data.php';
#文件包含 require 和 include 区别(找不到文件)
// include 'test.php';
require ‘test.php'
echo'我还能抢救一下!’;
#逻辑处理:权限判定、安全、操作正确性
#显示数据
// require_once '51list.html';
刷新。运行结果:Warning: require(test.php): failed to open stream: No such file or directory in D:
\server\Apache24\htdocs\52controller.php on line 12
Fatal error: require(0): Failed opening required 'test php' (include_path=':C:\php\pear') in D:
\server\Apache24\htdocs\52controller.php on line 12
前面还是警告,因为找不到这个,但是报了一个致命错误。找不到就不允许执行了,并且不能抢救。
这就是 include 和 require 的区别
二、与_once 的区别
示例:
include 与 include_once 的区别(require 和 require_once 一样)
include 重复包含文件
include 'data.php';
#输出 display
include 'data.php';
#报错:display 函数在前面已经定义过
include_once 重复包含文件
include_once'data.php';
#输出 idis 再 lay
include_once'data.php';
#没有任何反应(忽略)
1.没有_once:多次包含,系统会多次加载(如果有函数会报同名错误)
首先,
<?php
#数据提供文件(不会被访问,只会被 PHP 文件包含)
$info =[
'name'=>'犬夜叉',
'age'=>100,
'gender'=>'公'
];
function display(){
echo __FUNCTION__;
}
这是一种函数,且不允许再定一个。
<?php
#业务逻辑处理
#获取数据(自己处理或者从其他地方拿到数据)
//include '50data.php';
#文件包含 require 和 include 区别(找不到文件)
// include 'test.php';
//require‘test.php';(安全)
echo'我还能抢救一下!';
#有无_once 的区别
require '50data.php';
#逻辑处理:权限判定、安全、操作正确性
#显示数据
// require_once '51list.html';
这里建议用 require‘test.php'
,这个安全。因为通常包含一个文件,目的肯定是为了用它里面的东西。如果文件找不到,就没办法用了,所以建议用这个。运行成功。
然后如果想再包含一次 require '50data.php'
这个文件,
运行结果:
我还能抢救一下!Fatal error: Cannot redeclare display() (previously declared in D:\serverApache24\htdocs\50data.php:14) in D:\server\Apache24\htdocs\5
0data.php on line 15
这里还能抢救一次,但是出现了一个致命错误。Cannot redeclare 不能重生一个 display 函数,因为前面已经生成过了。关键是看报错在50data.php 的15行。
因为这个函数已经定义过了,也就是包含它的时候,它就已经被拿过来。这相当于,第一次包含时替换了它,第二次又包含又替换,这时就会出现一个问题。这里变量无所谓,本身可以重新复制,但是这个函数定义两个同名的,就没办法定义了。
所以,其实问题本质是:Fatal error: Cannot redeclare display( ) (previously declared in D:\server(Apache24\htdocs\52controller.php:26) in D:\server\Apache24\htdocs\52controller.php on line 37
也就是37行出错了,因为前面25号已经定义过了,所以这里就不行了,这就是他们的区别,就是如果多次包含如果带函数就会报错。
2.有_once:只包含一次,系统包含后会记录当前被包含文件是否包含过
⑴优势:安全
⑵缺点:效率低
接下来把两个 require '50data.php'
;注掉,
//require '50data.php';
//require '50data.php';
然后复制这个代码,用 once 再来一次。
require_once '50data.php';
require_once '50data.php';
运行发现没有报错。
因为当系统报错之后,它就把这个东西复制过来了,而且还记住这个文件已经被包含过了,所以当它再次出现的时候,就会被跳过,不执行了,因此就不会报错了。
所以有 once 就会跳过重复的,没有 once 就不会跳过,依然执行。
但事实上,尽量用没有 once 的这种。因为有 once 的有开销,所有犯的错误,都一定是建立在别人的成本上面。
三、小结
1、include 和 require 的区别是对于找不到文件的错误处理方式
⑴include 给个警告,代码继续运行
⑵require 给个错误,代码终止运行
2、include 和 include_once 的区别
⑴include 会重复包含,可能导致报错(结构重复)
⑵include_once 只会包含一次(有开销)
3、在编程过程中我们应该尽可能保证代码的可运行性
⑴尽可能使用 require 来包含结构和数据文件(容易排错)
⑵尽可能使用 include 来包含外部可能存在的文件
⑶尽可能不用_once 来进行文件包含
①效率低
②是否包含过应该开发者自己控制