require(),include(),require_once()和include_once()的异同
require()和include()有许多相似之处,也有些不同。理解它们的不同点非常重要,否则很容易犯错误。
我把这两个语句放在一起介绍,读者可以比较学习。
1.require()语句
比如:require()所包含的文件中不能包含控制结构,而且不能使用return这样的语句。在require()所包含的文件中使用return语句会产生处理错误。
require ( "http://some_server/file.txt?varfirst=1&varsecond=2" ); 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" ); |
2.include()语句
<?php $files = array ( 'first.php' , 'second.php' , 'third.php' ); for ( $i =0; $i < count ( $files ); $i ++) { include $files [ $i ]; } ?> |
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" ; ?> |
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 ); ?> |
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)的行为可能不是所期望的。
例子:
<?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; } ?> |