文件包含区别|学习笔记

简介: 快速学习文件包含区别

开发者学堂课程【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 找不到文件报警告错误,不影响后续代码的继续执行

image.png

<?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

这个告诉我们找不到这个文件,但是还能抢救一下。

image.png

这说明 include 只是警告错误,不影响后续发展。

当然,如果后续应用很多东西都依赖这个文件的话,那这种东西要在事先开发的时候就处理掉。

2.require 找不到文件报致命错误,后续代码终止执行

image.png

<?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 12Fatal error: require(0): Failed opening required 'test php' (include_path=':C:\php\pear') in D:

\server\Apache24\htdocs\52controller.php on line 12

image.png

前面还是警告,因为找不到这个,但是报了一个致命错误。找不到就不允许执行了,并且不能抢救。

这就是 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',这个安全。因为通常包含一个文件,目的肯定是为了用它里面的东西。如果文件找不到,就没办法用了,所以建议用这个。运行成功。

image.png

然后如果想再包含一次 require '50data.php' 这个文件,

image.png

运行结果:

我还能抢救一下!Fatal error: Cannot redeclare display() (previously declared in D:\serverApache24\htdocs\50data.php:14) in D:\server\Apache24\htdocs\50data.php on line 15

这里还能抢救一次,但是出现了一个致命错误。Cannot redeclare 不能重生一个 display 函数,因为前面已经生成过了。关键是看报错在50data.php 的15行。image.png

因为这个函数已经定义过了,也就是包含它的时候,它就已经被拿过来。这相当于,第一次包含时替换了它,第二次又包含又替换,这时就会出现一个问题。这里变量无所谓,本身可以重新复制,但是这个函数定义两个同名的,就没办法定义了。image.png

所以,其实问题本质是: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';

运行发现没有报错。

image.png

因为当系统报错之后,它就把这个东西复制过来了,而且还记住这个文件已经被包含过了,所以当它再次出现的时候,就会被跳过,不执行了,因此就不会报错了。

所以有 once 就会跳过重复的,没有 once 就不会跳过,依然执行。

但事实上,尽量用没有 once 的这种。因为有 once 的有开销,所有犯的错误,都一定是建立在别人的成本上面。


三、小结

1、include 和 require 的区别是对于找不到文件的错误处理方式

⑴include 给个警告,代码继续运行

⑵require 给个错误,代码终止运行

2、include 和 include_once 的区别

⑴include 会重复包含,可能导致报错(结构重复)

⑵include_once 只会包含一次(有开销)

3、在编程过程中我们应该尽可能保证代码的可运行性

⑴尽可能使用 require 来包含结构和数据文件(容易排错)

⑵尽可能使用 include 来包含外部可能存在的文件

⑶尽可能不用_once 来进行文件包含

①效率低

②是否包含过应该开发者自己控制

相关文章
|
存储 XML 安全
Jetpack DataStore 你总要了解一下吧?
一、DataStore 介绍 DataStore 是 Android Jetpack 中的一个组件,它是一个数据存储的解决方案,跟 SharedPreferences 一样,采用key-value形式存储。 DataStore 保证原子性,一致性,隔离性,持久性。尤其是,它解决了 SharedPreferences API 的设计缺陷。 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。
1228 0
Jetpack DataStore 你总要了解一下吧?
双T型振荡器主要特点和工作原理介绍
双T振荡器是另一种类型的RC振荡器,它产生正弦波输出,用于类似于电桥桥振荡器的固定频率应用。双T型振荡器在反相放大器的输出和输入之间的反馈回路(因此得名)中使用两个“Tee”形 RC 网络。
2605 0
双T型振荡器主要特点和工作原理介绍
|
传感器 机器学习/深度学习 算法
【WSN】无线传感器网络模拟器研究Matlab代码实现
【WSN】无线传感器网络模拟器研究Matlab代码实现
【WSN】无线传感器网络模拟器研究Matlab代码实现
|
10月前
|
消息中间件 Java API
深入简出的带你精通java线程
线程与进程是操作系统中的两个重要概念。进程是资源分配的最小单位,负责加载指令、管理内存和IO;线程是CPU调度的最小单位,也被称为轻量级进程。
218 36
深入简出的带你精通java线程
基于simulink的电弧炉模型建模与仿真
本课题基于Simulink构建电弧炉模型,进行仿真并输出电压、电流曲线及U-I分布图。使用MATLAB2022a版本完成核心程序与模型设计。电弧炉通过高压电弧加热炉料(废钢、生铁等),温度可达3000°C以上,促进脱碳、脱硫等反应。能量平衡和物质平衡是理解其工作机理的基础,动态模型描述状态随时间变化,如温度、成分分布。高效运行需先进的控制系统,包括电极位置、功率控制等。
|
12月前
|
数据采集 机器学习/深度学习 人工智能
《驯服“过拟合”之兽:守护人工智能算法的精准与稳健》
在人工智能发展中,过拟合是算法训练中常见问题,指模型过度学习训练数据中的细节和噪声,导致对新数据泛化能力差。为避免过拟合,需从数据质量和数量入手,确保数据多样性并适当增加数据量。同时,数据预处理(如归一化)、选择合适的模型复杂度、应用正则化技术(如L1/L2正则化)、采用早停法和交叉验证等方法,可有效提高模型的稳定性和准确性。防范过拟合至关重要,尤其在医疗、金融等领域,以确保算法的可靠性和实用性。
213 17
|
12月前
|
弹性计算 运维 安全
安全无处不在-aliyun云服务诊断评测
作为一名个人开发者,我酷爱编写博客分享技术知识。我对阿里云ECS十分感兴趣,将博客部署在其上,网址为[乙太的小屋](https://www.oisec.cn/)。为了确保网站安全,我启用了阿里云的“云资源健康状态及诊断”功能,该功能可实时监控和排查云服务问题,提升运维效率和安全性。此外,我还建议增加流量计费的预估费用和自动断网功能,以防止CC和DDoS攻击带来的高额费用。推荐更多人使用这一强大的工具,链接:[阿里云诊断工具](https://help.aliyun.com/zh/management-console/what-is-cloud-service-diagnostics)。
167 11
|
12月前
|
缓存 移动开发 网络协议
为什么会TCP粘包?读完这篇你就懂了
在网络编程中,TCP粘包问题指发送方多个数据包在接收方粘成一包,导致数据解析混乱。其原因包括Nagle算法合并小包、发送方收集多个小分组及接收方缓存积压等。解决方法有:固定消息长度、包尾加特殊标记(如\r\n)、包头加包体长度等。选择合适方案可确保数据传输的可靠性和准确性。
|
存储 人工智能 算法
NFT元宇宙链游系统开发技术规则逻辑及源码示例
NFT元宇宙链游系统开发涉及区块链、NFT、智能合约等核心技术。区块链确保去中心化和透明性,NFT用于确认数字资产所有权,智能合约管理数字资产的交易。源码示例展示了基于Solidity的NFT链游智能合约,包括NFT的铸造、收获和查询功能。
|
网络协议 API C语言
什么是远程调用?图文简要介绍
什么是远程调用?图文简要介绍
506 0