深入理解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与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
PHP SESSION机制的理解与实例
Mar 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
同时提取多条新闻中的文本一例
2006/10/09 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
电子商务专业学生职业生涯规划
2014/03/07 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
项目转让协议书
2014/10/27 职场文书
干部作风建设工作总结
2014/10/29 职场文书
戒赌保证书
2015/05/11 职场文书
致接力运动员加油稿
2015/07/21 职场文书
初中团支书竞选稿
2015/11/21 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
基于docker安装zabbix的详细教程
2022/06/05 Servers