深入理解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实现建立多层级目录的方法
Jul 19 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 PHP
Smarty实现页面静态化(生成HTML)的方法
May 23 PHP
PHP中的print_r 与 var_dump 输出数组
Jun 13 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
社区(php&amp;&amp;mysql)三
2006/10/09 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
使用nodejs中httpProxy代理时候出现404异常的解决方法
2016/08/15 NodeJs
angular学习之ngRoute路由机制
2017/04/12 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
Python的iOS自动化打包实例代码
2018/11/22 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
经理助理岗位职责
2014/03/05 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
英语感谢信范文
2015/01/20 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Python装饰器的练习题
2021/11/23 Python
MySQL分区以及建索引的方法总结
2022/04/13 MySQL