深入理解require与require_once与include以及include_once的区别


Posted in PHP onJune 05, 2013

PHP具有快速、可靠、跨平台应用、源代码开放等特点,使得PHP成为最受欢迎的服务器端Script语言之一。我根据自己在工作中体会到的,向大家介绍PHP使用的心得,希望对大家有所帮助。

利用PHP的Include files维护你的网站
不管你所开发的网站的规模是大是小,你都应该要认识到重复使用程序代码的重要性,不论你重复使用的是 PHP 程序或者是 HTML 原始码。举个例子来说,网站页尾的版权宣告至少每年都得修改一次,如果你的网站有许多个页面,该怎么办呢?动手一个一个修改这些页面肯定是一件头痛的事情。通过 PHP 我们可以用几个不同的方式来重复使用程序代码。要使用哪些函数端视你要重复使用的是怎样的内容而定。

这些主要的函数包括:
* include() 与 include_once()
* require() 与 require_once()

1.include() 函数会将指定的档案读入并且执行里面的程序。
例如:include('/home/me/myfile');
被导入的档案中的程序代码都会被执行,而且这些程序在执行的时候会拥有和源文件中呼叫到 include() 函数的位置相同的变量范围(variable scope)。你可以导入同一个服务器中的静态档案,甚至可以通过合并使用 include() 与 fopen() 函数来导入其它服务器上面的档案。

2.include_once()函数的作用和 include() 是几乎相同的
唯一的差别在于 include_once() 函数会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入该档案(这项功能有时候是很重要的,比方说要导入的档案里面宣告了一些你自行定义好的函数,那么如果在同一个程序重复导入这个档案,在第二次导入的时候便会发生错误讯息,因为 PHP 不允许相同名称的函数被重复宣告第二次)。

3.require()函数会将目标档案的内容读入,并且把自己本身代换成这些读入的内容。
这个读入并且代换的动作是在 PHP 引擎编译你的程序代码的时候发生的,而不是发生在 PHP 引擎开始执行编译好的程序代码的时候(PHP 3.0 引擎的工作方式是编译一行执行一行,但是到了 PHP 4.0 就有所改变了,PHP 4.0 是先把整个程序代码全部编译完成后,再将这些编译好的程序代码一次执行完毕,在编译的过程中不会执行任何程序代码)。require() 通常来导入静态的内容,而 include() 则适合用来导入动态的程序代码。

4.如同 include_once()函数,require_once() 函数会先检查目标档案的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容。
我个人习惯使用 require() 函数来导入版权宣告(copyrights),静态文字或其它本身不含有变量,或者本身需要倚赖其它执行过的程序才能正确执行的程序代码。例如:

<HTML>
<HEAD><TITLE>网页标题</TITLE></HEAD>
<BODY>
[一堆内容]
<?
// 导入版权宣告文字
require('/home/me/mycopyright');
?>
</BODY>
</HTML>

另一方面,我通常在程序的开头使用 include() 函数来导入一些函式库或者类似的程序代码:
<?
// 导入我的函式库
include('/home/me/myfunctions'); 
// 利用之前导入的函式库里面定义好的 PHP 函数执行一些功能
?>
<HTML>
<HEAD><TITLE>网页标题</TITLE></HEAD>
<BODY>
[一堆内容]
</BODY>
</HTML>

接下来你可能会问这第一个挺符合逻辑的问题:「这些被导入的档案要放在哪儿呢?」简短的答案是:「放在服务器档案系统里的任何地方都行。」然而,要留意的是如果被导入的档案除了单纯的程序代码片段以外还包含了一些敏感资料,例如连结数据库系统要用到的帐号和密码,那么建议你不要把这些档案放在 Web 服务器的文件根目录之下,因为那样的话他人便可以很容易地窃取到这些资料了。

你可以将这些被包含的档案放在系统的任何一个目录里面,唯一的条件是 PHP 本身用来执行的身分(www,nobody 或者其它身分)必须要有足够的权限能够读取这些档案就可以了。这些档案的扩展名也可以任意取,甚至没有附档名也无所谓。

善用include()和 require()来将网站里面经常需要变动的共享内容做合理的分割,在更新网站内容的时候将会容易进行得多。

利用PHP来维护档案系统
PHP 提供了很多与档案系统相关的函数,让我们不仅可以开启档案,还能够显示目录的内容,搬移档案的位置以及其它更多功能。有的朋友甚至写了能够通过浏览器来管理档案内容的 PHP 程序。

在开始介绍 PHP 的档案系统相关功能之前,我们要先理清一件事情:在 Windows操作系统里面,档案路径可以使用斜线(/)或者反斜线(\)来表示,但是在其它操作系统里面我们只会使用到斜线。为了保持统一性,下面的例子里面的档案路径都是使用斜线。

下面的例子程序我将教大家基本的目录内容显示功能,每个步骤都有批注,请直接阅读。

<? /* $dir_name 这个变量的值是你想要读取的目录的完整路径 */ 
$dir_name = "/home/me/"; 
/* opendir()函数会开启某个目录,并且传回一个参考值(handle)让我们可以用来在程序中参照到该目录 */ 
$dir = opendir($dir_name); 
/* 开始建立一个字符串,这个字符串包含了 HTML 的列表卷标,用来显示目录中的文件名称。 */ 
$file_list = "<ul>"; 
/* 使用一个 while 循环叙述将前面开启的目录中的档案全部读取一遍。如果读取到的档名不是「.」或者「..」,就把该档名写入前面提到的字符串里面去。 */ 
while ($file_name = readdir($dir)) { 
if (($file_name != ".") && ($file_name != "..")) { 
$file_list .= "<li>$file_name"; 
} 
} 
/* 替 HTML 列表卷标加上结尾 */ 
$file_list .= "</ul>"; 
/* 关闭之前开启的目录并且结束这段 PHP 程序 */ 
closedir($dir); 
?> 
<!-- HTML原始码从这里开始 -->
<HTML>
<HEAD>
</HEAD>
<BODY>
<!-- 使用 PHP 程序来将我们所读取的目录名称显示在页面上 -->
<P>Files in: <? echo "$dir_name"; ?></p>
<!-- 使用 PHP 程序将该目录中读取到的文件名显示在页面上 -->
<? echo "$file_list"; ?>
</BODY>
</HTML>

经过上面几步,你已经成功把某个目录中的文件名称显示在网页上了。但你要记住一点:要读取某个目录或者档案(读取档案内容的做法稍后会介绍),PHP 本身执行所用的身分必须至少拥有该目录或者档案的读取权限才行,否则系统会显示权限不足的错误讯息。

下一个例子我将教大家如何复制一个档案:

<? /* 变量$orginal储存源文件的完整路径,变量$copied储存复制过去的新档案的完整路径 */ 
$original = "/home/me/mydatabasedump";
$copied = "/archive/mydatabasedumo_1010"; 
/* 呼叫 copy() 函数把档案从原始位置复制一份到新的位置去。如果无法复制,那么便终止程序的执行并且显示错误讯息。 */
@copy($original, $copied) or die("无法复制档案。"); 
?>

上面的例子程序可以用来扩充成为一个档案备份系统程序。当这个程序执行的时候,它会将数据库的数据文件复制到其它目录下面做为备份之用。只要修改系统的排程档案内容(crontab),我们便可以让这个程序自动在每天的固定时间执行一次,达到系统自动备份,不需要人工手动执行。

如果你的系统上面有安装 Lynx 软件(Lynx 是一种纯文字的 Web 浏览器)的话,你可以在系统排程档案里面加入下面这笔记录来让系统在固定时间自动激活 Lynx 并且呼叫我们之前写好的 PHP 备份程序。当 Lynx 呼叫(浏览)我们的 PHP 程序的时候,该程序就会被执行,并且产生备份文件。下面这个例子教你如何在每天早晨五点钟执行我们的备份程序,并且在执行完以后自动将 Lynx 程序关闭:
0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1
如果你的系统安装的是 CGI 版本的 PHP,那么你可以直接呼叫 PHP 执行档而不需要通过 Lynx 来呼叫我们的 PHP 程序
php中include和require有什么区别
平常是没区别的.
当要加载的文件不存在时候, include会给一个warning警告, 然后继续运行. 而require则会给一个fatal error, 直接结束脚本
=====================================================
php手册里面是这样说的:
require() 和 include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用 require() 吧。include() 就不是这样,脚本会继续运行。

PHP 相关文章推荐
处理php自动反斜杠的函数代码
Jan 05 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 PHP
2014过年倒计时示例
Jan 31 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
php轻松实现文件上传功能
Mar 03 PHP
Laravel+jQuery实现AJAX分页效果
Sep 14 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
Sep 29 PHP
YII2框架使用控制台命令的方法分析
Mar 18 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 #PHP
基于php split()函数的用法详解
Jun 05 #PHP
深入PHP nl2br()格式化输出的详解
Jun 05 #PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 #PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 #PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 #PHP
基于PHP array数组的教程详解
Jun 05 #PHP
You might like
德生H-501的评价与改造
2021/03/02 无线电
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
用JavaScript实现动画效果的方法
2013/07/20 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
koa-router源码学习小结
2018/09/07 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python操作串口的方法
2015/06/17 Python
python黑魔法之编码转换
2016/01/25 Python
Python发展简史 Python来历
2019/05/14 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
教师节活动主持词
2014/04/02 职场文书
2014年个人年终总结
2015/03/09 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers