require()

require() 语句包含并运行指定文件。

require() 语句包含并运行指定文件。有关包括如何工作的详细信息见 include() 的文档。

require()include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告require() 则导致一个致命错误。换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用 require() 吧。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path

例子 16-4. 基本的 require() 例子

<?php

require 'prepend.php';

require
$somefile;

require (
'somefile.txt');

?>

更多例子参见 include() 文档。

注: 在 PHP 4.0.2 之前适用以下规则:require() 总是会尝试读取目标文件,即使它所在的行根本就不会执行。条件语句不会影响 require()。不过如果 require() 所在的行没有执行,则目标文件中的代码也不会执行。同样,循环结构也不影响 require() 的行为。尽管目标文件中包含的代码仍然是循环的主体,但 require() 本身只会运行一次。

注: 由于这是一个语言结构而非函数,因此它无法被变量函数调用。

警告

Windows 版本的 PHP 在 4.3.0 版之前不支持本函数的远程文件访问,即使 allow_url_fopen 选项已被激活。

参见 include()require_once()include_once()eval()file()readfile()virtual()include_path


add a note add a note User Contributed Notes
bmessenger at 3servicesolution dot com
18-Oct-2006 04:06
// Looks like I might have a fix for some on the
// relative path issue.

if (!function_exists('bugFixRequirePath'))
{
   function bugFixRequirePath($newPath)
   {
       $stringPath = dirname(__FILE__);
       if (strstr($stringPath,":")) $stringExplode = "\\";
       else $stringExplode = "/";
      
       $paths = explode($stringExplode,$stringPath);
      
       $newPaths = explode("/",$newPath);
      
       if (count($newPaths) > 0)
       {
           for($i=0;$i<count($newPaths);$i++)
           {
               if ($newPaths[$i] == "..") array_pop($paths);   
           }
          
           for($i=0;$i<count($newPaths);$i++)
           {
               if ($newPaths[$i] == "..") unset($newPaths[$i]);
           }
          
           reset($newPaths);
          
           $stringNewPath = implode($stringExplode,$paths).
               $stringExplode.implode($stringExplode,$newPaths);
          
               return $stringNewPath;
       }
   }   
}

require_once(bugFixRequirePath("../config.php"));
gabe at websaviour dot com
14-Jul-2006 08:42
If you are experiencing a bug related to using relative paths with include or require, it may be related to a grandparent directory that is executable but not readable.  It will cause __FILE__ to return a relative path instead of the full path which it is supposed to show.  This manifests itself in interesting ways that can be seemingly unrelated.  For instance, I discovered it using the Smarty {debug} command which failed to find its template due to this issue.  Please see the following for more details:

http://bugs.php.net/bug.php?id=34552
http://shiftmanager.net/~kurt/test/
Inc
31-May-2006 11:35
I have found a problem when I try to access a php file via require($class_directory)

// # $class_directory contain a long full path and dot into the last folder.
// # $class_directory = "/var/.../app/system/plugintoto_1.0/class_plugintoto_1.0.php";

// dot ('.') and minus ('-') are not accepted in require !
tjeerd
11-May-2006 09:41
When using symbolic links with PHP, specify a dotslash './page.php' path to ensure that PHP is looking in the right directory with nested requires:

E.g. when the required actual page1.php contains other require statements to, say page2.php, PHP will search the path that the symbolic link points to, instead of the path where the symbolic link lives. To let PHP find the other page2.php in the path of the symbolic link, a require('./page2.php'); statement will solve the puzzle.
webmaster at netgeekz dot net
25-Feb-2006 01:34
I have learnt to manipulate this code into an effecitve and easy to use form. I use it with require_once, but it could be used for require.

require_once($_SERVER['DOCUMENT_ROOT'].'/includes/top.php');

This mainly jumps back to the servers document root and then begins to enter the directories defined until it finds the file. In this case it would go back to the root of the server, or whatever your document root is, and then enter includes. there it would search for the top.php file. Simple to use, yet effective...espcially for people like me who re-use code or move files to different directories. I don't have to fix the includes, because they all work the same way.
steve at walkerfx dot com
25-Feb-2006 07:24
WARNING: Be absolutely sure that your include paths are relative or directory based and not http!!!

   require("http://www.mydomain.com/somefile.php"); //WRONG!!
   require("usr/mydomain/somefile.php"); //CORRECT!!

If you are intending to access local files and you accidentally use an http address, the request will probably work. However, this creates a wierd situation that can cause all sorts of bugs in your scripts and slow your code down.

The problem is that the include spawns off another php request, and is essentially requesting the file in the same a way a remote viewer would. So rather than including the intended php code, instead you get the processed output from that single file executed in its own private scope.

It's a simple mistake, but it can be an awful problem to debug.

Walker
dave at davidhbrown dot us
23-Jan-2006 04:08
re: danielm at unb dot br...

$_SERVER['DOCUMENT_ROOT'] is very useful, but it is not available with all web servers. Apache has it; IIS doesn't.

I use the following to make my PHP applications work in more situations:
<?php
if (!defined("BASE_PATH")) define('BASE_PATH', isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : substr($_SERVER['PATH_TRANSLATED'],0, -1*strlen($_SERVER['SCRIPT_NAME'])));
?>

...but even that gets tripped up by symlinks to different mount points, etc. You could substitute realpath($_SERVER['PATH_TRANSLATED']), but that function has been reported not to work on some (Windows) servers. One could use the PATH_TRANSLATED for both servers, but I figure if Apache is going to tell me exactly what I want to know, I should listen.
tuxedobob at mac dot com
07-Jul-2005 02:54
Something which may not be immediately obvious is that if you use double quotes on the filename, you can use variables to specify the filename, allowing you to do something like this:

<?php
$query
= "SELECT filename FROM updates WHERE version>$current ORDER BY version";
$updateresult = mysql_query($query) or exit($query.'<br />'.mysql_error());
while (
$updaterow = mysql_fetch_row($updateresult)) {
   require
"$updaterow[0]";
}
?>

Drop this in a script on a server and you can push updates to your clients. Obviously, make sure you only run scripts you want to.
Marc
07-May-2005 01:42
This will sound elementary, but for C++ native programmers, be sure NOT to put a '#' in front of your include statements! The parser will not give you an error, but also will not include the file, making for a tedious debugging process.

In short, USE:
<?php
    
include "yourfile.php";
?>

and DON'T use:
<?php
    
#include "yourfile.php";
?>
richardbrenner(-at- )gmx(-)at
08-Apr-2005 04:58
If you use relativ paths in a php script (file A) that can be required by another php script (file B), be aware that the relativ paths in file A will be relativ to the directory, where file B is stored.
You can use the following syntax in file A, to be sure that the paths are relativ to the directory of file A:

<?
require(dirname(__FILE__)."/path/relative/file_to_include.php");
?>

Greetings,
Richard
11-Feb-2005 02:29
Note when calling any require or include function, that the call will block if the script given as the parameter is excecuting.
Because of this one should be careful when using blocking functions like sleep() in a script which is included by another.
danielm at unb dot br
22-Nov-2004 03:50
if you want to include files with an absolut path reference, you can use:

require ($_SERVER["DOCUMENT_ROOT"]."/path/to/file.php");

this way you can organize your files in subdirectories trees.