PHP 8.3.0 RC 6 available for testing

require

(PHP 4, PHP 5, PHP 7, PHP 8)

requireinclude 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

参见 include 文档了解详情。

add a note

User Contributed Notes 23 notes

up
140
chris at chrisstockton dot org
16 years ago
Remember, when using require that it is a statement, not a function. It's not necessary to write:
<?php
require('somefile.php');
?>

The following:
<?php
require 'somefile.php';
?>

Is preferred, it will prevent your peers from giving you a hard time and a trivial conversation about what require really is.
up
22
Marcel Baur
2 years ago
If your included file returns a value, you can get it as a result from require(), i.e.

foo.php:
<?php
return "foo";
?>

$bar = require("foo.php");
echo $bar; // equals to "foo"
up
-7
Anonymous
16 years ago
A note that drove me nuts for 2 days!

Be carfull if you have a newline or blank space befor your php tags in the included/required file it will read as html and outputed.

If your running your output through javascript string evaluations which would be sensitive to newlines/white spaces be carfull that the first chars in the file are the php tages eg <?php
up
-16
tjeerd
17 years ago
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.
up
-10
phpDev a t eSurfers_dot_ com
7 years ago
I didn't find mention that calling return from inside an required file is different than calling return from inside an included file.

return "aaa"; if called in the global scope of an included file will terminate the inclusion and return control to the main file givin "aaa" as a result of the include statement itself.

As far as I have tested (PHP 5.6.10) this does not apply to require
up
-12
Wing
13 years ago
if you want always include, require, open files using some 'root' folder based path you may may put file '.htroot' in 'root' folder and use this.

while(!file_exists(getcwd()."/.htroot")){chdir('..');}

This code change current dir to dir where '.htroot' file located and everywhere you can use relative to 'root' paths.

Please avoid absent of '.htroot' file.
up
-12
webmaster at netgeekz dot net
17 years ago
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.
up
-15
dank at kegel dot com
8 years ago
PHP's require and include seem to differ from C's include in another way: they can't be used in the middle of an expression. e.g.

$ more foo1.php foo2.php
::::::::::::::
foo1.php
::::::::::::::
<?php
print "hello"
.
#"there"
require 'foo2.php';
.
"\n";
?>
::::::::::::::
foo2.php
::::::::::::::
"there"
$ php foo1.php
PHP Parse error: syntax error, unexpected '.' in foo1.php on line 6

So php's include operates only on complete statements, whereas c's include operates on bytes of source code.
up
-15
Peter McDonald
16 years ago
re the comment by moazzamk at gmail dot com

As the manual states require and require_once as of PHP 4.02 no longer call the file if the line of code it is on should not be executed.
up
-14
richardbrenner(-at- )gmx(-)at
18 years ago
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
up
-20
pedro dot evangelista at gmail dot com
14 years ago
Be careful when using symbolic links, because require will search the real path of the file and not the path relative to the symbolic link.

Imagine your script A.php resides on directory /a and you create a symbolic link for it on directory /b/c.
So for the code

<?php
echo realpath("../");
?>

you might expect the directory /b, but actually you get the root directory /.

If you need to include the file /b/B.php inside your A.php, you can't use the following

<?php
require "../B.php";
?>

because it will search the root directory, not the /b directory.

Regards.
up
-14
bmessenger at 3servicesolution dot com
17 years ago
// 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"));
up
-21
some dot user at notarealdomain dot com
16 years ago
Discovered a bit of weird behavior yesterday involving require() (using PHP 5.2.3). If you use require() inside a function, the "globals" in the file will be local to the function. An example of this:

test.php:
<?php
function TestFunc()
{
require(
'test2.php');
echo
"<pre>" . print_r($GLOBALS, true) . "</pre>";
}
?>

test2.php:
<?php
$MyTestGlobal
= Array();
?>

This happens because require is a statement that _inlines_ the target code - not a function that gets called.

To fix this, use the $GLOBALS superglobal:

test2.php:
<?php
$GLOBALS
["MyTestGlobal"] = Array();
?>
up
-15
theunis dot botha1 at gmail dot com
9 years ago
Just for those who may wonder about receiving E_WARNING (in custom error handlers) - PHP generates an E_WARNING when require or require_once fails - and before control returns to your script, it generates an E_COMPILE_ERROR.

So when require() or require_once() fails - don't be surprised to see two messages in your logs (if you have your logging setup this way) - once for the E_WARNING caught by your custom error handler, and once for getting the error from error_get_last() in your shutdown function (which is the actual E_COMPILE_ERROR you were expecting)
up
-14
danielm at unb dot br
18 years ago
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.
up
-16
hans at ratzinger dot com
10 years ago
Thanks a lot for this information Brian! This drove me nuts for many hours! This is the first information I found in the web that a white page can be caused by a require -> your script will die if the file is not found!!!
up
-27
dave at davidhbrown dot us
17 years ago
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.
up
-15
Inc
17 years ago
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 !
up
-24
gabe at websaviour dot com
17 years ago
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/
up
-26
duccio at getlocal dot it
14 years ago
In response to some dot user at notarealdomain dot com:

This is because require executes the code "as if" it was code written inside of the function, inheriting everything including the scope. But here there is something even more interesting:

<requiredfile.php>:
<?php

$this
->a.=" is visible also under a require\n";
$b="While the variable b is a local variable of the function\n";
function
FunctionUnderRequire() {
echo
"But the functions declared inside of a require called from a class function, just as when defined from inside any other function, are always global\n";
}
?>

<mainfile.php>:
<?php

error_reporting
(E_ALL|E_STRICT);

class
UserClass {

protected
$a;

public function
UserFunction() {
$this->a='The class variable a';
require
'requiredfile.php';
echo
$this->a; // "The class variable a is visible also under a require\n"
echo $this->b; // Notice: Undefined property: UserClass::$b
echo $b; // "While the variable b is a local variable of the function\n"
$this->FunctionUnderRequire(); //Fatal error!
FunctionUnderRequire(); // "But the functions..."
}
}

$UserClass=new UserClass;
$UserClass->UserFunction();
?>

I'm wondering if there is a method for declaring class public/private/protected functions from inside a require/include...
up
-15
Anonymous
18 years ago
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.
up
-6
osheros at hotmail dot com
1 year ago
When using an include file to define one or more global variables (to avoid having to redefine them in multiple files), make sure you're referencing the same variable.

[global.php]
$app_dir = "/app/path/here";

[main.php]
include "global.php";

/* the following obviously won't work but hopefully I can save somebody else hours trying to figure out why their global include isn't working */

echo $app_folder;
up
-21
scott
16 years ago
If you want to verify that a file can be included or required, the simplest solution I've found is just to check that the file exists.

<?php

if(file_exists($pageContentInc)){
require_once
$pageContentInc;
}else{
$pageContentInc = "common/content_404.inc";
require_once
$pageContentInc;
}
?>

Does it really need to be any harder than that?
To Top