require(),include(),require_once()和include_once()区别与用法

require,include语句很有用,它们能包含位于独立文件中的代码,实现代码结构的模块化,方便调用。

require_once()和include_once()语句分别对应于require()和include()语句。require_once() 和include_once()语句主要用于需要包含多个文件时,可以有效地避免把同一段代码包含进去而出现函数或变量重复定义的错误。

如果php配置文件php.ini中的URL fopen wrappers 是打开的(默认情况下是打开的),就可以使用URL来指定文件的位置从而实现远程文件的调用。

这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告require() 则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用require()include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。

require()语句用于指定的文件代替语句本身,就象C语言中的include()语句一样。

使用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文件中所包含的内容是在远程服务器上处理以后的结果。例如:

  1. /*
  2. 这个例子假设some_server服务器可以解释.php文件,而不对.txt文件进行解释。在远程文件中
  3. 需要变量$varfirst和$varsecond
  4. */
  5. /*不能正确执行,远程服务器不处理.txt文件*/
  6. require( "http://some_server/file.txt?varfirst=1&varsecond=2");
  7. /*不正确,这样只能在本地机上寻找file.php文件*/
  8. require( "file.php?varfirst=1&varsecond=2");
  9. /*正确的语句*/
  10. require( "http://some_server/file.php?varfirst=1&varsecond=2");
  11. $varfirst= 1;
  12. $varsecond= 2;
  13. require( "file.txt"); /*正确的语句*/
  14. 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()来包含不同的文件。 例如:

  1. <?php
  2. $files= array( 'first.php', 'second.php', 'third.php');
  3. for($i= 0;$i<count($files);$i++)
  4. {
  5. include $files[$i];
  6. }
  7. ?>

在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

  1. <?php
  2. echo "Before the return<br>\n";
  3. if( 1)
  4. {
  5. return 27;
  6. }
  7. echo "After the return<br>\n";
  8. ?>

假设在main.php文件中包含下面的语句:

  1. <?php
  2. $retval= include( 'test.inc');
  3. echo "File returned:'$retval'<br>\n";
  4. ?>

php3.0解释器会在第二行报告错误,而不能得到include()语句的返回值。但在php4.0中会得到下面的结果: 
Before the return 
File returned: '27' 
下边假设main.php改为:

  1. <?php
  2. include( 'test.inc');
  3. echo "Back in main.html<br>\n";
  4. ?>

在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:

  1. <?php
  2. define(PHPVERSION,floor(phpversion()));
  3. echo "GLOBALS ARE NICE<br>\n";
  4. function goodTea()
  5. {
  6. return "Olong tea tasts good!";
  7. }
  8. ?>

和fool.inc:

  1. <?php
  2. require ( "util.inc");
  3. function showVar($var)
  4. {
  5. if(PHPVERSION== 4)
  6. {
  7. print_r($var);
  8. }
  9. else
  10. {
  11. var_dump($var);
  12. }
  13. }
  14. ?>

然后在error_require.php中包含这两个文件:

  1. <?php
  2. require( "fool.inc");
  3. require( "util.inc"); //此句会产生一个错误
  4. $foo= array( "1", array( "complex", "quaternion"));
  5. echo "this is requiring util.inc again which is also<br>\n";
  6. echo "required in fool.inc\n";
  7. echo "Running goodTea:".goodTea(). "<br>\n";
  8. echo "Printing foo:<br>\n";
  9. showVar($foo);
  10. ?>

当运行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 代码。 


require_once

使用方法:

?
1
2
require_once "test.php" ;

一般是放在PHP文件的最前面将文件内容引入,PHP会先将待引入的文件内容引入到本文件中,如果引入失败则不会继续往下执行;如果引入成功,则可正常执行下面的代码。

它的使用方式与require差不多,不同的是require_once只会引入一次,如果之前已引入过,则不会再引入!


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

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

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

    ?
    1
    include "test.php" ;

    一般是放在流程控制的处理部分中使用,将文件内容引入。PHP程序在遇到include语句时,才将它读进来,这种方式可以把程序执行时的流程简单化,便于复用代码!

    include在引入不存文件时产生一个警告且脚本还会继续执行,执行时需要引用的文件每次都要进行读取和评估,且有返回值,比如:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if (FALSE) {
       include 'test.php' ; // test.php不会被引入
    }
      
    <?php
      include 'test.php' ; // 现在的条件是test.php不存在
      echo '标哥的技术博客' ; // 仍然执行下面的代码
    ?>
      
    $ret = include "QueryPhone.php" ;
    if (! empty ( $ret )) {
       echo "文件引入成功" ;
    } else {
       echo "文件引入失败" ;
    }

    include_once

    使用方法:

    ?
    1
    2
    include_once "test.php" ;

    加了_once之后,表示文件已引入的将不再引入。include_once引入文件的时候,如果碰到错误会给出提示并继续运行下边的代码!

    他的使用方式与include差不多,不同的是include_once只引入一篇!

    require

    使用方法:

    ?
    1
    2
    require "test.php" ;

    一般是放在PHP文件的最前面将文件内容引入,PHP会将require的文件内容先引入成功当前文件的一部分,然后才开始执行后面的代码。

    require在引入文件失败时会给出提示且脚本会被中断执行。比如:

    ?
    1
    2
    3
    4
    5
    // 文件是不存在的
    require "QueryPhone.php" ;
      
    echo "没有被打印" ;

    require_once

    使用方法:

    ?
    1
    2
    require_once "test.php" ;

    一般是放在PHP文件的最前面将文件内容引入,PHP会先将待引入的文件内容引入到本文件中,如果引入失败则不会继续往下执行;如果引入成功,则可正常执行下面的代码。

    它的使用方式与require差不多,不同的是require_once只会引入一次,如果之前已引入过,则不会再引入!

    综合例子

    假设有一个文件中a.php,里面只有一句echo file name is a;

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      
    include 'a.php' ;
    require 'a.php' ;
      
    include_once 'a.php' ;
    require_once 'a.php' ;

    那么上面这四个引入会打印多少行呢?其实只会打印前面的两句代码执行结果,因此只有两个:

    ?
    1
    2
    3
    file name is a
    file name is a

    下面我们来交换一下前两行与后两行试试:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      
    include_once 'a.php' ;
    require_once 'a.php' ;
      
    include 'a.php' ;
    require 'a.php' ;

    那么上面这四句会打印出多少行呢?自然是四行,因为前两行在此之前并没有引入过,因此会引入一次,而include/require虽然之前引入过,还会再引入,因此打印结果:

    ?
    1
    2
    3
    4
    5
    file name is a
    file name is a
    file name is a
    file name is a

    注意事项

    从理论上说,include和require后面加不加括号对执行的结果并没有什么区别,但是加上括号效率相对会较低,所以通常后面能不加括号就不要添加括号了!

    }

猜你喜欢

转载自blog.csdn.net/li_lening/article/details/80989456
今日推荐