深入理解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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
swoole_process实现进程池的方法示例
Oct 29 PHP
TP5框架实现签到功能的方法分析
Apr 05 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
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
行政内勤岗位职责
2014/04/07 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
给医院的感谢信
2015/01/21 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL