require(),include(),require_once()和include_once()的异同


Posted in PHP onJanuary 02, 2007

require()和include()有许多相似之处,也有些不同。理解它们的不同点非常重要,否则很容易犯错误。 

我把这两个语句放在一起介绍,读者可以比较学习。 
1.require()语句 
  require()语句用于指定的文件代替语句本身,就象C语言中的include()语句一样。如果php配置文件php.ini中的URL fopen wrappers 是打开的(默认情况下是打开的),就可以使用URL来指定文件的位置从而实现远程文件的调用。 
  有一点就是使用require()和include()语句时要特别的注意。那就是在被包含的文件中,处理器是按照html模式来解释其中的内容的,处理完被包含的内容后又恢复到php模式。所以如果需要在被包含文件中使用php语法,就要使用正确的php开始和结束标记来把这些语句包含进去。 
  require()和include()知识php中的一种语言特性,而不是函数。它们和函数有许多不同的地方。 
比如:require()所包含的文件中不能包含控制结构,而且不能使用return这样的语句。在require()所包含的文件中使用return语句会产生处理错误。 
  不象include()语句,require()语句会无条件地读取它所包含的文件的内容,而不管这些语句是否执行。所以如果你想按照不同的条件包含不同的文件,就必须使用include()语句。当然,如果require()所在位置的语句不被执行,require()所包含的文件中的语句也不会被执行。 
  require()不能在循环体中根据条件的不同而包含不同的文件。require()语句只会在第一次执行时调用它所包含的文件中的内容替换本身这条语句,当再次被执行时只能执行第一次所包含的语句。但是include()语句可以在循环体中来包含不同的文件。 
  require()语句中的变量继承require()语句所在位置的变量作用域。所有在require()语句的位置可以访问的变量,在require()语句所包含的文件中都可以访问。如果require()语句位于一个函数内部,那么被包含文件内的语句都相当于定义在函数内部。 
  require()语句在PHP程序执行前就会将使用require引用的文件读入,因此require通常放到程序的开始处。因此要特别注意一点,require语句有一点强,不管程序是否真的需要引用的文件,只要你使用require语句,它都会把他们包含进来!即使你是在条件控制语句中使用这个函数进行包含,那怕是那个条件不为真,引用文件也会被包含进来!形成了僵尸,在运行过程中这些僵尸是不起任何可见作用的,但是很明显它会加重负担,所以这一点要特别注意!如果使用require语句发生了包含错误,那么程序将输出出错信息并停止运行!! 

  如果require()语句通过声明文件的URL来包含远程文件,而且远程服务器按照php代码来解释该文件的话,本地php文件中所包含的内容是在远程服务器上处理以后的结果。例如: 
  /* 
    这个例子假设some_server服务器可以解释.php文件,而不对.txt文件进行解释。在远程文件中   
  需要变量$varfirst和$varsecond 
  */ 
  /*不能正确执行,远程服务器不处理.txt文件*/ 
  require("http://some_server/file.txt?varfirst=1&varsecond=2"); 

  /*不正确,这样只能在本地机上寻找file.php文件*/ 
  require("file.php?varfirst=1&varsecond=2"); 

  /*正确的语句*/ 
  require("http://some_server/file.php?varfirst=1&varsecond=2"); 

  $varfirst=1; 
  $varsecond=2; 
  require("file.txt"); /*正确的语句*/ 
  require("file.php"); /*正确的语句*/ 
  本来在php3.0中,require()所包含的文件可以使用return语句,但条件是return语句不能出现在{}内部,而必须出现在被包含文件的全局范围内。在php4.0中已经取消了require()的这个功能,但是仍然可以使用include()来实现。 

2.include()语句 
  include()语句和require()语句有许多相同的地方。凡是在上边require()语句中没有明确说明不能适用于include()的部分外,require()语句的功能完全适用于include()语句。下边介绍require()语句所没有的include()语句的功能和特点。 
  include语句只有在被执行时才会读入要包含的文件。在错误处理方便,使用include语句,如果发生包含错误,程序将跳过include语句,虽然会显示错误信息但是程序还是会继续执行! 
    php处理器会在每次遇到include()语句时,对它进行重新处理,所以可以根据不同情况的,在条件控制语句和循环语句中使用include()来包含不同的文件。 
    例如: 
  <?php 
    $files=array('first.php','second.php','third.php'); 
    for($i=0;$i<count($files);$i++) 
    { 
        include $files[$i]; 
    } 
  ?> 
    在php3.0和php4.0中include()语句所包含的文件中都可以使用return语句来返回一个值,并停止执行被包含文件下面的内容。但php3.0和php4.0在处理这样的情况时有所不同。在php3.0中return语句不能包含在{}内,除非它在一个函数中,因为这时它表示函数的返回值而不是文件的返回值。而在php4.0中就没有了这样的限制,用户甚至可以在文件中返回一个数字,就象函数的返回值一样。这样的语句在 

php3.0中通常会报告错误。以下举例说明: 
    假设被包含的文件为test.inc和主文件main.php位于一个目录中。test.inc的内容如下: 
test.inc 
<?php 
  echo "Before the return<br>\n"; 
  if(1) 
  { 
    return 27; 
  } 
  echo "After the return<br>\n"; 
?> 

假设在main.php文件中包含下面的语句: 
<?php 
  $retval=include('test.inc'); 
  echo "File returned:'$retval'<br>\n"; 
?> 
  php3.0解释器会在第二行报告错误,而不能得到include()语句的返回值。但在php4.0中会得到下面的结果: 
  Before the return 
  File returned: '27' 
  下边假设main.php改为: 
<?php 
  include('test.inc'); 
  echo "Back in main.html<br>\n"; 
?> 
  在php4.0中的输出结果是: 
  Before the return 
  Back in main.html 

  在php5.0中的输出结果也是: 
  Before the return 
  Back in main.html 

  在php3.0中的输出结果是: 
  Before the return 
  27Back in main.html 

  Parse error:parse error in /apache/htdocs/phptest/main.html on line 5 

  出现上面的错误是因为return语句位于{}内部而且不是一个函数内部。如果把{}去掉,使它位于test.inc的最外层,输出结果是: 
  Before the return 
  27Back in main.html 
  之所以出现27,是因为在php3.0中不支持include()返回。 

3.require_once()和include_once()语句 
  require_once()和include_once()语句分别对应于require()和include()语句。require_once()和include_once()语句主要用于需要包含多个文件时,可以有效地避免把同一段代码包含进去而出现函数或变量重复定义的错误。例如:如果创建两个文件util.inc和fool.inc,程序代码分别为: 
  util.inc: 
  <?php 
    define(PHPVERSION,floor(phpversion())); 
    echo "GLOBALS ARE NICE<br>\n"; 
    function goodTea() 
    { 
      return "Olong tea tasts good!"; 
    } 
  ?> 
  和fool.inc: 
  <?php 
    require ("util.inc"); 
    function showVar($var) 
    { 
      if(PHPVERSION==4) 
      { 
          print_r($var); 
      } 
      else 
      { 
          var_dump($var); 
      } 
    } 
  ?> 
  然后在error_require.php中包含这两个文件: 
  <?php 
    require("fool.inc"); 
    require("util.inc");//此句会产生一个错误 
    $foo=array("1",array("complex","quaternion")); 
    echo "this is requiring util.inc again which is also<br>\n"; 
    echo "required in fool.inc\n"; 
    echo "Running goodTea:".goodTea()."<br>\n"; 
    echo "Printing foo:<br>\n"; 
    showVar($foo); 
  ?> 
  当运行error_require.php时,输出结果如下: 
  GLOBALS ARE NICE 
  GLOBALS ARE NICE 

  Fatal error:Cannot redeclare goodTea() in util.inc on line 4 

  如果使用require_once()语句来代替 require()语句,就不会出现上面的错误。我们把error_require.php和fool.inc中的require()语句改为require_once()语句并重命名为error_require_once.php,这是显示结果如下: 
  GLOBALS ARE NICE 
  this is requiring util.inc again which is also 
  required in fool.inc Running goodTea:Olong tea tastes good! 
  Printing foo: 
  Array([0] => 1 [1] => Array ([0] => complex [1] = quaternion)) 

  include_once()语句的语法和include()语句类似,主要区别也是避免多次包含一个文件而引起函数或变量的重复定义。 

  require_once语句有一个引用链,它可以保证文件加入你的程序仅仅只有一次,而且会避开变量值和函数名之间的冲突。 

  和require_once语句一样,include_once语句把include的功能扩展了。在程序执行期间,将指定的文件包含进来,如果从文件引用进来的程序先前已经包含过的时候,include_once()就不会把它再包含进来。也就是仅仅可以引用同一个文件一次! 

  include_once() 语句在脚本执行期间包含并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。 

include_once() 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。 

使用 require_once() 和 include_once() 的更多例子见最新的 PHP 源程序发行包中的 PEAR 代码。 

返回值和 include() 相同。如果文件已被包含,本函数返回 TRUE。 

注: include_once() 是 PHP 4.0.1pl2 中新加入的。 

注: 要注意 include_once() 和 require_once() 在大小写不敏感的操作系统中(例如 Windows)的行为 

可能不是所期望的。 
例子: include_once() 在 Windows 下不区分大小写 

<?php 
include_once("a.php"); // this will include a.php 
include_once("A.php"); // this will include a.php again on Windows! (PHP 4 only) 
?>   

此行为在 PHP 5 中改了,路径先被规格化,因此 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的实现一样,文件只会被包含一次。 

  如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出。 

win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许Linux下情况不同,暂时还没测试。 

如果一个文件不想被包含多次可以使用include_once或require_once## 读取,可以写入文档数据。 
<?php 
function r($file_name) { 
 $filenum=@fopen($file_name,"r"); 
 @flock($filenum,LOCK_SH); 
 $file_data=@fread($filenum,filesize($file_name)); 
 @fclose($filenum); 
 return $file_data; 

function w($file_name,$data,$method="w"){ 
 $filenum=@fopen($file_name,$method); 
 flock($filenum,LOCK_EX); 
 $file_data=fwrite($filenum,$data); 
 fclose($filenum); 
 return $file_data; 

?>

PHP 相关文章推荐
解决MySQL中文输出变成问号的问题
Jun 05 PHP
PHP 分页类(模仿google)-面试题目解答
Sep 13 PHP
php中mysql模块部分功能的简单封装
Sep 30 PHP
用php实现选择排序的解决方法
May 04 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
PHP+Javascript实现在线拍照功能实例
Jul 18 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
开发大型 PHP 项目的方法
Jan 02 #PHP
phpwind中的数据库操作类
Jan 02 #PHP
PHP无限分类的类
Jan 02 #PHP
php你的验证码安全码?
Jan 02 #PHP
一个PHP操作Access类(PHP+ODBC+Access)
Jan 02 #PHP
一个用php实现的获取URL信息的类
Jan 02 #PHP
PHP 和 MySQL 开发的 8 个技巧
Jan 02 #PHP
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
PHP Pear 安装及使用
2009/03/19 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
P/Invoke是什么
2015/07/31 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
校园创业策划书
2014/01/14 职场文书
品质主管岗位职责
2014/03/16 职场文书
小学新学期寄语
2014/04/02 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
关于倡议书的范文
2015/04/29 职场文书
交通事故案件代理词
2015/05/23 职场文书