PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

require_once> <require
Last updated: Fri, 29 Aug 2008

view this page in

include()

include()文は指定されたファイルを読み込み、評価します。

以下の記述内容はrequire()にも当てはまります。これら2つの構文は、 エラーの扱い方を除けば全く同様に振舞います。エラーが発生するとどちらも Warning を出力しますが、 require() を使用している場合は Fatal Error となります。 言い換えると、指定されたファイルが無い場合に処理を停止したい場合は require() を使用した方が良い、ということになります。 include() を使用すると、 読み込むべきファイルが存在しない場合も処理が続行されます。 include_path を適切に設定することも忘れないでください。 PHP 4.3.5 より前のバージョンでは include されたファイルにパースエラーが あっても処理が続行されましたが、それ以降のバージョンでは処理を停止します。

読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 例えば、include_pathが librariesで、カレントの ワーキングディレクトリが /www/ の 場合、include/a.php を読み込んで、そのファイルの中に include "b.php" と書いてあったとすると、 b.php がまず /www/librariesで探され、その後、 /www/include/で探されます。 ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。

ファイルが読み込まれるとそのファイルに含まれるコードは、 include()もしくはrequire()が実行された 行の変数スコープを継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。 しかし、読み込まれたファイル内で定義されている関数やクラスはすべて グローバルスコープとなります。

例1 基本的なinclude()の例

vars.php
<?php

$color 
'green';
$fruit 'apple';

?>

test.php
<?php

echo "A $color $fruit"// A

include 'vars.php';

echo 
"A $color $fruit"// A green apple

?>

呼び出し側のファイルの関数定義の中で読み込みが行われた場合は、 読み込まれるファイルに含まれる全てのコードは、 その関数内で定義されているものとして動作します。 従って変数のスコープもその関数のものが継承されます。 ただ マジック定数 は例外で、これは読み込みを行う前にパーサが評価します。

例2 関数内での読み込み

<?php

function foo()
{
global 
$color;

    include 
'vars.php';

    echo 
"A $color $fruit";
}

/* vars.php は foo() のスコープを継承するため *
 * $fruit はこの関数の外では無効となります。  *
 * $color はglobalとして宣言されているため    *
 * 有効です。                                 */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

ファイルが読み込まれるときには、読み込まれるファイルの先頭で PHPモードを抜けてHTMLモードになり、最後に再びPHPモードに戻ります。 このため、読み込むファイル中のPHPコードとして実行する必要がある コードは、 有効なPHPの開始タグおよび終了タグで括る必要があります。

"URL fopenラッパー"が 有効になっている場合(デフォルト設定では有効です)、ローカルなパス名 の代わりにURL(HTTP経由)を用いて読み込むファイルを指定することが可能です。 URLで指定されたサーバがファイルをPHPコードとして解釈することが 出来る場合には、HTTP GETを使用してURLリクエストに引数を指定することが 出来ます。これはファイルの読み込み云々やスコープの継承とは関係なく、 ただ単純にスクリプトがリモートのサーバで実行されて結果がローカルの スクリプトに読み込まれる、というだけのことです。

警告

PHP 4.3.0 より前のバージョンの Windows 版 PHP は、現在この関数に関してリモートファイルアクセス機能を サポートしていません。これは、allow_url_fopen を 有効にした場合でも同様です。

例3 HTTP経由のinclude()

<?php

/* この例は www.example.com が.phpはPHPスクリプトとして扱い、.txtは通常の *
 * ファイルとして扱うように設定されていると仮定しています。また、ここでの *
 * '動作します'という言葉の意味は、変数$fooと$barが読み込まれる側のファイ *
 * ルで使用可能である、ということです。                                   */

// 動作しません: www.example.com では file.txt はPHPコードとして解釈されません。
include 'http://www.example.com/file.txt?foo=1&bar=2';

// 動作しません: 'file.php?foo=1&bar=2' という名前のファイルをローカルファイル
// システム上から探し出そうとします。
include 'file.php?foo=1&bar=2';

// 動作します。
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo 1;
$bar 2;
include 
'file.txt';  // 動作する
include 'file.php';  // 動作する

?>

警告

セキュリティの警告

リモートファイルはリモートサーバ上で実行されます(ファイルの拡張子や リモートサーバが PHP の実行を許可しているかどうかに依存します)が、 有効な PHP スクリプトである必要があります。なぜならそれはローカル サーバ上で処理されるからです。もしリモートサーバ上で処理された結果が ほしいだけならば、readfile() を使用するほうがよい でしょう。そうでなければ、リモートスクリプトが有効な期待通りのコードを 生成していることを確認するため、注意を払うことが必要になります。

リモートファイル, fopen(), file()も参照してください。

値の返し方: 読み込まれたファイル内では、ファイルの実行処理を終了し呼出側の スクリプトに戻るためにreturn()文を実行することが可能です。 読み込まれたファイルから値を返すことも可能です。 通常の関数で行うのと同様にincludeコールの値を取得することができます。 しかし、読み込まれたリモートファイル(ローカルファイルの場合も同様)の出力が、 有効なPHPの開始/ 終了タグを有していない限り、リモートファイルを読み込む際に値を 取得することはできません。 必要な変数をこれらのタグの中で宣言することができ、これらの変数は ファイルが読み込まれた位置で使用可能となります。

include() は特別な言語構造であるため、 引数の前後に括弧は不要です。 返り値を比較する際には注意してください。

例4 インクルードの戻り値を比較する

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 
'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 
'OK';
}
?>

例5 include()return()

return.php
<?php

$var 
'PHP';

return 
$var;

?>

noreturn.php
<?php

$var 
'PHP';

?>

testreturns.php
<?php

$foo 
= include 'return.php';

echo 
$foo// 'PHP'と出力されます

$bar = include 'noreturn.php';

echo 
$bar// 1が出力されます

?>

読み込みが成功すると$barの値は1となります。上の2つの例の違いに 注目してください。最初の例では読み込まれるファイル側でreturn() を使用し、もう一方では使用していません。 ファイルが読み込めなかった場合、FALSE が返され、 E_WARNING が発生します。

読み込まれるファイルで定義された関数がある場合、 これらは、return()の前後によらず メインファイルで使用できます。 このファイルが二度読み込まれた場合、PHP 5は関数が定義済みであるため 致命的なエラーを発生します。一方、PHP 4は return()の後に定義された関数については、 エラーを発生しません。 ファイルが読み込み済みであるかどうかを調べ、 読み込まれるファイルの内容を条件分岐で返すかわりに include_once()を使用することを推奨します。

PHP ファイルの内容を変数に "include する" もうひとつの方法は、 出力制御関数include() とともに用いて 出力をキャプチャすることです。たとえば、

例6 出力バッファリングを用い、 PHP ファイルの内容を文字列として読み込む

<?php
$string 
get_include_contents('somefile.php');

function 
get_include_contents($filename) {
    if (
is_file($filename)) {
        
ob_start();
        include 
$filename;
        
$contents ob_get_contents();
        
ob_end_clean();
        return 
$contents;
    }
    return 
false;
}

?>

スクリプト中で自動的にファイルをインクルードするには、php.iniauto_prepend_file および auto_append_file オプションも参照ください。

注意: これは、関数ではなく 言語構造のため、可変関数 を用いて コールすることはできません。

require(), require_once(), include_once(), get_included_files(), readfile(), virtual() および include_path も参照ください。



require_once> <require
Last updated: Fri, 29 Aug 2008
 
add a note add a note User Contributed Notes
include
darkain at darkain dot com
03-Aug-2008 01:08
in response to pepesantillan at gmail dot com

here is a much simpler way of accessing the entire global scope from within a function, reguardless of variable types.

test.php
<?php
 
function my_include($file) {
   
//get access to all globals
   
foreach ($GLOBALS as $key => $val) { eval("global \$$key;"); }

   
//include our file
   
include($file);
  }

 
$example = 1;

 
my_include('example.php');

  echo
$example;
?>

example.php
<?php
  $example
= 2;
?>

display:
2
rich dot lovely at klikzltd dot co dot uk
18-Jul-2008 05:20
I needed a way of include()ing a php page from a MySQL database.  It took some work, but
eventually I came up with this:

<?php
function include_text($text){
    while(
substr_count($text, '<?php') > 0){             //loop while there's code in $text
       
list($html, $text) = explode('<?php', $text, 2); //split at first open php tag
       
echo $html;                                      //echo text before tag
       
list($code, $text) = explode('?>', $text, 2);    //split at closing tag
       
eval($code);                                     //exec code (between tags)
   
}
    echo
$text;                                          //echo whatever is left
}
?>

It doesn't work exactly the same as include(), as newlines after the '?>' tag are echoed, rather
than being discarded, but that's an exercise left to the reader to fix if they so desire, and
also globals defined within the included text are not available outside the function.

Not sure whether it would work with something like:

<?php if($x){ ?>
<p>Some HTML Output</p>
...
...
<?php }
else{
?>
<p>Other HTML Output</p>
...
...
<?php } ?>

I rarely use that, but it's easy to re-write code to avoid it using HereDoc syntax, so the example above becomes:

<?php if($x){ echo <<<EOT
<p>Some HTML Output</p>
...
...
EOT;
}
else{ echo <<<
EOT
<p>Other HTML Output</p>
...
...
EOT;
}
?>

Which would work with include_text()

It also won't work as-is with either asp-style or short tags.
phpincludenote at mooreds dot com
26-Jun-2008 03:29
Here's how to send headers with a URL include, if you'd like:

http://www.mooreds.com/wordpress/archives/000477
huuanito
26-Jun-2008 02:34
When using includes with allow_url_include on in your ini beware that, when accessing sessions from included files, if from a script you include one file using an absolute file reference and then include a second file from on your local server using a url file reference that

they have different variable scope

and the same session will not be seen from both included files. The original session won't be seen from the url included file.

So:

main script:
<?php
session_start
();
$_SESSION['count'] = 234;

echo
"sid from script1".session_id();
include
"/var/www/htdocs/file1";
include
"http://yoursite/file2";
?>

file1
<?php
echo " **sid from file1: ".session_id();
echo
" count from file1= ".$_SESSION['count'];
?>
echoes both a session id and the count

but file2
<?php
echo " **sid from file2: ".session_id();
echo
" count from file2= ".$_SESSION['count'];
?>
echoes just the text, no session id and no count.
g4wx3
25-Jun-2008 10:52
Don't forget about the DIRECTORY_SEPARATOR constant.
No tricks needed to identify the OS;
just use it:

include($folder.DIRECTORY_SEPARATOR.$file;)
*hint make a function
developer at aeropress dot com
18-Jun-2008 09:13
The code in EXAMPLE #5 above does NOT work if you attempt to include by URL.  I have been unable to discover any scheme at all that will pass a variable in this manner.
marabbeh
16-Jun-2008 10:46
Thanks to alex carstea and tim furry for absolute path function. Here is (just) a bit faster version :

<?php
// The function returns the absolute path to the file to be included.
// This path can be used as argument to include() and resolves the problem of nested inclusions.
function getFilePath($relative_path) {
   
// $abs_path is the current absolute path (replace "\\" to "/" for windows platforms)
   
$abs_path=str_replace("\\", "/", dirname($_SERVER['SCRIPT_FILENAME']));
   
$relative_array=explode("/",$relative_path);
   
$abs_array=explode("/",$abs_path);
   
// for each "../" at the beginning of $relative_path
    // removes this 1st item from $relative_path and the last item from $abs_path
   
while ($relative_array and ($relative_array[0]=="..")) {
       
array_shift($relative_array);
       
array_pop($abs_array);
    }
   
// and implodes both arrays
   
return implode("/", $abs_array) . "/" . implode("/", $relative_array);  
}
?>
ricardo dot ferro at gmail dot com
15-May-2008 03:14
Two functions to help:

<?php

function add_include_path ($path)
{
    foreach (
func_get_args() AS $path)
    {
        if (!
file_exists($path) OR (file_exists($path) && filetype($path) !== 'dir'))
        {
           
trigger_error("Include path '{$path}' not exists", E_USER_WARNING);
            continue;
        }
       
       
$paths = explode(PATH_SEPARATOR, get_include_path());
       
        if (
array_search($path, $paths) === false)
           
array_push($paths, $path);
       
       
set_include_path(implode(PATH_SEPARATOR, $paths));
    }
}

function
remove_include_path ($path)
{
    foreach (
func_get_args() AS $path)
    {
       
$paths = explode(PATH_SEPARATOR, get_include_path());
       
        if ((
$k = array_search($path, $paths)) !== false)
            unset(
$paths[$k]);
        else
            continue;
       
        if (!
count($paths))
        {
           
trigger_error("Include path '{$path}' can not be removed because it is the only", E_USER_NOTICE);
            continue;
        }
       
       
set_include_path(implode(PATH_SEPARATOR, $paths));
    }
}

?>
phpnet at freshsite dot de
14-May-2008 08:01
A note about the "return - thing":

test2.php
<?php
$r
= true;
return
$r;
?>

test1.php: (Does NOT work)
<?php

function functionA(){
    return
functionB();
}
function
functionB(){
    require_once
'test2.php';
   
}

var_dump(functionA());
?>

When you call test1.php, result will be NULL.
You have to "return" the include like this:
test1.php CORRECT:
<?php

function functionA(){
    return
functionB();
}
function
functionB(){
    return require_once
'test2.php';
   
}

var_dump(functionA());
?>
fernandoleal at drakecall dot com
13-May-2008 02:55
Like the manual says the includes gets all function and variable on global scope that
Includes errors so watch out if you disable display errors with @ because it also hides the included file errors, its kind of dumb :$ hehe but sometime you miss it when you want to prevent displaying errors.
This also applies to include_once, require and require_once.
Example
“index.php”
<?php 
#Shows the error ‘Parse error: syntax error, unexpected T_VARIABLE in’
include(test.php);
#Doesn’t show the error
@include(test.php);
?>
“test.php”
<?php
$parse_error
?>
Rick Garcia
09-May-2008 01:38
As a rule of thumb, never include files using relative paths. To do this efficiently, you can define constants as follows:

----
<?php // prepend.php - autoprepended at the top of your tree
define('MAINDIR',dirname(__FILE__) . '/');
define('DL_DIR',MAINDIR . 'downloads/');
define('LIB_DIR',MAINDIR . 'lib/');
?>
----

and so on. This way, the files in your framework will only have to issue statements such as this:

<?php
require_once(LIB_DIR . 'excel_functions.php');
?>

This also frees you from having to check the include path each time you do an include.

If you're running scripts from below your main web directory, put a prepend.php file in each subdirectory:

--
<?php
include(dirname(dirname(__FILE__)) . '/prepend.php');
?>
--

This way, the prepend.php at the top always gets executed and you'll have no path handling headaches. Just remember to set the auto_prepend_file directive on your .htaccess files for each subdirectory where you have web-accessible scripts.
etadpole23_2 at yahoo dot com
01-May-2008 08:18
It aggravated me trying to get an absolute URL include from another one of my sites; then it occurred to me to check the phpinfo().

Under the "PHP Core" section; look for these values:
allow_url_fopen
allow_url_include

Turns out, both of mine are turned off.  If you are stuck, try this snippet that  {oasis1 (at) geocities (d@t) com} wrote earlier:
<?php

$times
= substr_count($_SERVER['PHP_SELF'],"/");
$rootaccess = "";
$i = 1;

while (
$i < $times) {
 
$rootaccess .= "../";
 
$i++;
}
include (
$rootaccess."path_to_script");

?>

Thanks a ton Oasis!
Alexander
10-Mar-2008 01:09
include() statement generates a compilation-time error when used inside a class declaration (but not within a function). For example:
<?php
class MyClass
{
 include
"file1.php";
 include
"file2.php";

 function
func1()
 {
 .......
}
?>
uramihsayibok, gmail, com
25-Feb-2008 10:28
I have a need to include a lot of files, all of which are contained in one directory. Support for things like <?php include_once 'dir/*.php'; ?> would be nice, but it doesn't exist.

Therefore I wrote this quick function (located in a file automatically included by auto_prepend_file):
<?php

function include_all_once ($pattern) {
    foreach (
glob($pattern) as $file) { // remember the { and } are necessary!
       
include $file;
    }
}

// used like
include_all_once('dir/*.php');

?>
A fairly obvious solution. It doesn't deal with relative file paths though; you still have to do that yourself.
pepesantillan at gmail dot com
25-Dec-2007 06:13
In response to the last post...

instead of using your function to include a file, you can directly include files. But I guess my_include does something else besides including files and thats why you use it.

Im learning php (just got to this part of the manual, that much of a begginer I am) but a solution I can think of (and I am posting it because your post is from about a day ago) is using an array as a parameter in the function my_include. That array would contain all your local (global) variables and would pass them to your function and made them local for that function... Heres and example (hoping its not so hard to understant)

<?php
//sample function, note the referencing of the array using &
function my_include($file_to_include,&$my_array_of_globals) {
  
//you can find explanation on the function extract
   //from the function list on this page, always check
   //that list, is really usefull!. Extract would go at the very   
   //beggining of the function my_include.
  
extract($my_array_of_globals);
  
//now you have a kind of simulation of using global with
   //any single variable of your script
  
include($file_to_include);
  
//in this part we recreate the array containing our variables
   //this would go at the very end of the function
  
$my_array_of_globals = compact(array_keys($my_array_of_globals));

}

//some variables
$var1 = 1;
$var2 = 3;
echo
"First print before calling the function:<BR>\$var1 is $var1, \$var2 is $var2<BR>";

//in this part we create an array containing our variables
//this is the array we will pass to the function
foreach ($GLOBALS as $key => $value){
  if (!
is_array($value)) {
   
//is not array? what?... yup, just to avoid post, get, cookie, etc...
    //and what if I have a variable that its an array?
    //as sad as it is for me, my method wont allow you
    //to get arrays back from the function
   
$some_globals["$key"] = $value;
  }
}
//and we call our function using this array
$include_string = $_SERVER["DOCUMENT_ROOT"]."/include_me.php";
//I like using include without the help of php.ini include_path
my_include($include_string,$some_globals);
//after that we extract our variables from $some_globals
extract($some_globals);
echo
"Second print, after calling the function:<BR>\$var1 is $var1, \$var2 is $var2<BR>";
?>

This is include_me.php
<?php
// sample included file, it could try to access some variables
//from the file including him and even try to change them
  
$var1++;     //from var1 = 1 to var1 = 2
  
$var2 *= 2//from var2 = 3 to var2 =6
?>

and the output:
First print before calling the function:
$var1 is 1, $var2 is 3
Second print, after calling the function:
$var1 is 2, $var2 is 6

It is not an elegant nor efficient solution, but I wanna try to help you with the little knowledge I have. Hope it is of any help! Hope someone else posts a solution!

Merry Christmass to everyone
slush puppie
25-Oct-2007 03:40
two little methods i wrote up that work on our IIS6 server. the first makes an alternate include call you can use to include things by calling them via their root location. the second method alters the include path so all include() calls are via the root location.

these are a compilation of a few methods i found here, but i think i made them a bit more modular. anyhow...

<?php
   
## MAKES A NEW FUNCTION CALLED rinclude() THAT INCLUDES
    ## A FILE RELATIVE TO THE ROOT DIRECTORY
    ## LEAVE include() UNTOUCHED SO IT CAN STILL BE USED AS NORMAL
   
function rinclude($path){
       
$levels = substr_count($_SERVER['PHP_SELF'],'/');
       
$root = '';
        for(
$i = 1; $i < $levels; $i++){$root .= '../';}
        include(
$root . $path);
    }
   
   
rinclude('file.inc.php'); // in root
   
rinclude('dir/file.inc.php'); // in a subfolder
?>
<hr />
<?php
   
## SET INCLUDE TO ROOT DIRECTORY SO ALL include()
    ## CALLS WILL BE RELATIVE TO ROOT
   
function setinclude(){
       
$levels = substr_count($_SERVER['PHP_SELF'],'/');
       
$root = '';
        for(
$i = 1; $i < $levels; $i++){$root .= '../';}   
       
set_include_path($root);
    }   
   
   
setinclude();   
    include(
'file.inc.php'); // in root
   
include('dir/file.inc.phpp'); // in a subfolder
?>
sbwoodside at yahoo dot com
08-Oct-2007 06:19
Here's a really simple solution to a common problem. Let's say you want to include files the way that apache does, relative to the document root (the root dir of your app). Independent of what server you are on, so that you don't have to specify an absolute path on your filesystem. At the top of your page put:

<?php set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); ?>

Now anywhere you do an include you can do something like:

<?php include ( "Templates/header.inc") ?>

So, if your server files are in /var/www/mysite, this will include /var/www/mysite/Templates/header.inc when it's on your server. And if on your dev machine it's in /user/myname/mysite, it will include /user/myname/mysite/Templates/header.inc when it's on your dev machine.
gomodo at free dot fr
02-Sep-2007 07:29
Reponse to rayro at gmx dot de (21-Aug-2007 11:48 )

Hi rayro,
your code :
<?php
include(realpath('../../../test.php'));
?> 
..Don't works when a function is called by another remote function (with a another remote include) -> realpath don't use __FILE__ reference :(

This works always and everywhere ( thanks to Jonny Rylands http://fr2.php.net/manual/fr/function.realpath.php#56773 ) :

<?
 
include (realpath(dirname(__FILE__).'/relative/path/to/include.inc.php'));
?>

friendly.
twolfley at gmail dot com
31-Aug-2007 02:37
With a large system you might have lots of functions. I have noticed that this can produce large memory overhead, some of which can be alleviated by using includes in the following manner:

e.g.
<?php
function foo() {
 
//some long block of code here producing $bar
 
return $bar;
}
?>

can be rewritten as:
<?php
function foo() {
  return include
"foo.php";
}
?>

where foo.php contains the following:
<?php
//long block of code producing $bar
return $bar;
?>

The result is the function's body does not get loaded into memory until the function is actually called.
eeckart at gmail dot com
17-Aug-2007 01:17
In reference to the fopen() and $use_include_path workaround for checking whether a include file exists as posted by [arnold at bean-it dot nl]...

I did some benchmarks with 100 dirs (each with 1 file) in the include_path on Apache/2.0.55 (Win32) PHP/5.2.1.

Here are the results:

(note: in the success scenarios, I am include'ing the file in the LAST directory on the include stack. This is to maximize the seek time; fail scenarios simply use a non-existent file; all times are in seconds )

benchmarks --> plain vanilla INCLUDE

(success)
0.05515718460083
0.054859161376953
0.053768157958984

(fail)
0.22402501106262
0.17378783226013
0.14510798454285

benchmarks --> fopen() and $use_include_path workaround

(success)
0.060588836669922
0.069549798965454
0.056423902511597

(fail)
0.05295991897583
0.039775133132935
0.054499864578247

>>> CONCLUSION

In cases involving MANY include paths, include() is -marginally- faster than the workaround (unsurprising - we incur the extra overhead of BOTH the fopen() call AND the $use_include_path seek). I say marginal in comparison to the "fail" scenarios, detailed next..

The most surprising thing is the inefficiency of include() when you are trying for a non-existent file. As compared to the workaround, the native include() method is roughly 3 times slower.

Based on additional tests (50 paths only), I note that any decrease in seek time for either case is generally linear to the number of paths.

---

THEREFORE, depending on the amount of paths you have, you might want to resort to different methods of optimizing the includes in your scripts, especially if you need to constantly test for the existence of include'd files (our organization uses a templating engine that relies on a virtual flat directory structure using the set_include_path() function).

---

From a technical perspective, I have no idea why this is the case and I find the prospect of trawling the PHP source to be rather daunting. However, as an educated guess: I figure that the include() code assumes the file exists, and so wastes processor cycles making a system read call, which inevitably fails.

For those interested in the benchmark script, you can email me at the email address provided above. No support, of course. :P
tim furry
10-Aug-2007 12:09
A small tweak to alex's getFilePath function allows it to work for Windows-based PHP as well:

<?php
$absPath
= str_replace("\\", "/", dirname($_SERVER['SCRIPT_FILENAME']));
?>

Windows recognizes a forward slash as a directory separator character.

Using $_SERVER['DOCUMENT_ROOT'] and similar solutions didn't seem to work for web paths with internal symbolic links.  Alex's function gets around that and works great.
alex carstea
27-Jul-2007 12:07
Since include() caused me many problems when i was trying to test my code, I wrote a small function. It receives as parameter the path to the file to include relative to the current file. The format similar to :
       "../../path/FileName.php"
The function returns the absolute path to the file to be included. This path can be used as argument to include() and resolves the problem of nested inclusions.
<?php
function getFilePath($relativePath){
    
$absPath=dirname($_SERVER['SCRIPT_FILENAME']);
    
    
$relativeArray=explode("/",$relativePath);
    
$absArray=explode("/",$absPath);
    
$upTokens=0;
    
//count the number of ".." tokens that precede the path
    
while(( $upTokens<count($relativeArray)) and ($relativeArray[$upTokens]=="..")) {
        
$upTokens++;
     }
    
// create the absolute path    
    
$filePath=$absArray[0];
     for (
$i=1; $i< (count($absArray)-$upTokens);$i++) {
        
$filePath.="/".$absArray[$i];
     }
    
     for (
$i=$upTokens; $i< count($relativeArray);$i++){
        
$filePath.="/".$relativeArray[$i];
     }
     return
$filePath;
 }
?>
  Hope you will find it usefull....

  Alex
Cory Gagliardi
26-Jul-2007 03:22
Easy way to set $_GET values for local includes.

This is an easy way to make up fake URLs for SEO purposes that are really just running other PHP pages with special $_GET values.

This will NOT work:
<?PHP
include('communities.php?show=gated&where=naples');
?>

However, this will:
<?PHP
$_GET
= array();
$_GET['show'] = 'gated';
$_GET['where'] = 'naples';
include(
'communities.php');
?>

Putting this on your page and nothing else will give the same result as going to
'communities.php?show=gated&where=naples'
but the URL can be whatever you want it to be.
php_notes (at) megaphone . ch
20-Jul-2007 08:28
If you use php >5.2, don't forget to set up the allow_url_include parameter in php.ini file .. If not you can search a long long long long time after this like-a-bug problem ;)

http://www.php.net/manual/en/ini.php
adam at adamleayr dot id dot au
03-Jul-2007 09:22
In response to oasis1 below, I use mod_rewrite to pipe all my requests through the index.php file, so I'm able to use the below code to find the root directory:

$sRoot = $_SERVER['HTTP_HOST'] . dirname($_SERVER['SCRIPT_NAME']);

You may be able to modify it to suit yourself.
oasis1 at geocities dot com
30-Jun-2007 12:11
What a pain! I have struggled with including files from various subdirectories.  My server doesn't support an easy way to get to the root HTML directory so this is what I came up with:

<?php

$times
= substr_count($_SERVER['PHP_SELF'],"/");
$rootaccess = "";
$i = 1;

while (
$i < $times) {
 
$rootaccess .= "../";
 
$i++;
}
include (
$rootaccess."foo/bar.php");

?>

This will give you what it takes to get to the root directory, regardless of how many subdirectories you have traveled  through.
post-nospam at brucemiller dot co dot uk
04-Jun-2007 06:07
A very EASY way to get 'include' to find its way to another directory, other than setting the 'include path', and useful for fetching one or two files:

include ($_SERVER['DOCUMENT_ROOT']."/foo/bar.php");

This creates an include that is relative to the root rather than the current directory.

The dot is for concatenation, not current directory, as with 'include path' syntax.

See Appendix M of Manual > Reserved words > Predefined Variables, for more info on $SERVER.
user at example.com
21-May-2007 12:38
Regarding the caching of includes.
I submitted a bug for this, apparently it's not a bug it's supposed to work that way for some reason.
The bugs team declined to elaborate as to why but it would seem includes aren't meant to use dynamic code, which makes this function worthless and by extension makes php needlessly time consuming because you can't reuse files properly.
treyh at wilnet1 dot com
17-May-2007 11:26
I needed to use an include with an echo statement, with http authenication so I thought I'd share. It's basic but I didn't find it documented anywhere:

    include 'http://treyh:pass@192.168.0.60/update2_count3.php?data=' . $row[id];
14-May-2007 12:40
Even when you set cache control and expiry headers:

header("Expires: 0");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("cache-control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");

It doesn't seem to reparse the include on the second hit to the page without a forced refresh.
e.g. a page where you direct to a login page which changes a $_SESSION var then returns to the originating page.
The originating page doesn't execute the code so it looks like still not logged in.
cmedina at bluecorestudio dot com
01-May-2007 02:03
I wanted that included files behave like in C/C++ and this  was killing me. So I created this function that really helped me (Note: You should add these lines to EVERY included file).

Code Lines:
<?
$FILE_PATH
= preg_replace_callback(
 
'/(.*)(\\\?.*?)\s*;\1(\\\?.*?)\s*$/',
   
create_function(
       
'$matches',
       
'$path = str_replace("\\\", "/",(isset($matches[2])?
        preg_replace(
        \'/(?:^\/|^\\\\\)?[^\/\\\\\]+(?:\/|\\\\\)?/\',
        "../",$matches[2]):"./").
        (isset($matches[3])?$matches[3]:""));
        return !empty($path)? "$path/" : "./";'
   
)
    ,
realpath("./").";".dirname(__FILE__)
);
?>

Usage Example:
Files hierarchy for example
/www/file.php
/include/secondfile.php
/include/test/anotherfile

<? //file.php
//i will not include the code lines in example to avoid repetition but you have to

// --- FILE_PATH code lines here ---

// include the file relative to the caller position remember to use a relative path from each file to desired file
include ($FILE_PATH . "../../include/secondfile.php");
?>

<? //secondfile.php

// --- FILE_PATH code lines here ---

//note that path used is in reference to secondfile.php's path and not the original caller's(file.php) path
include ($FILE_PATH . "test/anotherfile"); //or include ($FILE_PATH . "./test/anotherfile");
?>

<? //anotherfile

/* --- some mixed content here --- */

?>

Now you can do recursive includes to files inside already
included files using each file's path as reference, like in
c/c++!!!

I'd tested this just in WINXP (PHP Version 4.4.1), so, I
dont know how it behaves in other OS/PHP-Versions. Any
additional suggestions or bugs, please let me know.
gabriel at bumpt dot net
10-Mar-2007 12:36
In response to baofu:

The problem with calling:

set_include_path( ... )

before including any file, is that if one of the included files, in turn, does a set_include_path to include yet another bunch of files, then the following include statement in your topmost file, is done in an include path context that has changed.

Using: include dirname(__FILE__).'/../foo/bar' remains the best solution.
Khaos
24-Feb-2007 04:43
This might help a bit for security (no guarantees).

Instead of
include $page;
put
include str_replace('../', '', './' . $page);
-hh-
23-Feb-2007 08:47
coldflame,
<?=$foo?> equals <? print $foo ?>
If 1 is not needed at the end, just use <? include($filename) ?> without the equal sign.
anon
13-Feb-2007 10:49
Be careful using the <?= / ?> start and end tags with include / require.

A lovely feature/bug/misunderstanding meant that the result of

<?=include(filename)?>

was to get the contents of the file, suffixed with a '1'. I can only assume that the one is the return code of the include.

hopefully my pain can help somebody else :D

cheers,

coldflame
mbread at m-bread dot com
11-Feb-2007 02:23
If you have a problem with "Permission denied" errors (or other permissions problems) when including files, check:

1) That the file you are trying to include has the appropriate "r" (read) permission set, and
2) That all the directories that are ancestors of the included file, but not of the script including the file, have the appropriate "x" (execute/search) permission set.
Nathan Ostgard
20-Jan-2007 07:32
You can also use debug_backtrace to write a function that do the chdir automatically:

<?php
function include_relative($file)
{
   
$bt = debug_backtrace();
   
$old = getcwd();
   
chdir(dirname($bt[0]['file']));
    include(
$file);
   
chdir($old);
}
?>
anonymous
19-Jan-2007 06:49
When I'm dealing with a package that uses relative includes of its own, rather than modify all of their includes, I found it was easier to change PHP's working directory before and after the include, like so:

<?
$wd_was
= getcwd();
chdir("/path/to/included/app");
include(
"mainfile.php");
chdir($wd_was);
?>

This way neither my includes nor theirs are affected; they all work as expected.
dionyziz at deviantart dot com
19-Jan-2007 01:06
In reply to the last anonymous note, this is exactly the way mediawiki code handles this problem. They have various-depth include paths.

So, for instance, inside includes/normal/UtfNormal.php (as of revision 19455) they do:

<?php
   
require_once dirname(__FILE__).'/UtfNormalUtil.php';
?>

...to include the file includes/normal/UtfNormal.php.
vahe dot ayvazyan at googlemail dot com
10-Jan-2007 08:12
If you want the "include" function to work correctly with paths and GET parameters, try the following code:

<?php
    $_GET
['param1'] = 'param1value';
   
$_GET['param2'] = 'param2value';
    @include(
$_SERVER['DOCUMENT_ROOT'] . "/path1/path2/include.php");
?>

Then within your "include.php" use $_GET['param1'] and $_GET['param2'] to access values of parameters.

I spent several hours to figure this out.
anonymous
01-Jan-2007 11:42
I'm gonna throw my hat in the rink and also say that I've always thought that the include path being relative to the current directory is silly. PHP is the only language I can think of that does this. Almost all of my include paths have always had to be prefixed with <?php dirname(__FILE__) ?> to operate expectedly.
Nathan Ostgard
29-Dec-2006 04:27
I have to agree with sean dot farrell at digital-egg dot org.

If I put "../" or "./" in a call to include(), I expect it to be relative to the file I am including from, not the current working directory of the application.

This backwards mentality for relative paths really interferes with PHP's ability to build packages of files independent of an application.
sean dot farrell at digital-egg dot org
29-Nov-2006 11:12
The way PHP handles the ./ and ../ is totally counter intuitive. As said if the included file is preceded by a ./ and ../ it looked up from the current working directory. And that is defined by the of the EXECUTED script. That is the script that you specified in the url.

So if your have a.php that includes include/b.php that includes ../extern/c.php, it will not do what you want. You can use extern/c.php instead if you never execute outside of the document root. For me that just will not cut it. Since I execute test suites if files are directly called, like in python.

Here is my dirty trick that works, since I only have two levels of file hierarchy:

set_include_path("../:./");
require_once("extern/c.php");

And here is an open question: Why are the included files not looked up relative from the file that includes them and then in the include path? This would be a behavior like in all other languages.
rickkyREMOVETHIS at gmail dot com
17-Nov-2006 06:03
In response to http://uk.php.net/manual/en/function.include.php#38000

Using the following at the top of your CLI scripts will make includes work similar to web PHP.

#!/usr/bin/php
<?php chdir(dirname(__FILE__)); ?>

This changes the current working directory to the one your script is running in. Its quite used for taking existing web scripts and getting them to run quickly in the command line.
Janci
17-Nov-2006 12:59
Please note that althought you can call a function that is DEFINED later in the code, you cannot call a function that is defined in a file which is INCLUDED later. Consider following two examples:

Example 1:
<?php
test
();

function
test()
{
  echo
'In test.';
}
?>

Example 2:
file1.php:
<?
test
();

include
'file2.php';
?>

file2.php:
<?
function test()
{
  echo
'In test.';
}
?>

Please be aware that while the first example will work as expected, the second one will generate a fatal error "Call to undefined function: test() ...". The same is true for the require.
mlindal at pfc dot forestry dot ca
09-Aug-2006 12:33
If a person directly accesses an include file by mistake, you may want to forward them to a correct default page.

Do this by:

Say the file to be included is 'newpubs.php'

and the main pages are either newpubs_e.php or newpubs_f.php

if($_SERVER[PHP_SELF]=="/newpubs.php")
    {
    header("Location: newpubs_e.php");
    exit;
    }

Will send them to newpubs_e.php if they try to access newpubs.php directly.
medhefgo at googlemail dot com
27-May-2006 08:50
Because there is no quick way to check if a file is in include_path, I've made this function:

<?php

function is_includeable($filename, $returnpaths = false) {
   
$include_paths = explode(PATH_SEPARATOR, ini_get('include_path'));

    foreach (
$include_paths as $path) {
       
$include = $path.DIRECTORY_SEPARATOR.$filename;
        if (
is_file($include) && is_readable($include)) {
            if (
$returnpaths == true) {
               
$includable_paths[] = $path;
            } else {
                return
true;
            }
        }
    }

    return (isset(
$includeable_paths) && $returnpaths == true) ? $includeable_paths : false;
}

?>
NOdasnipaSPAM
20-May-2006 06:40
at spam guard dot gmail com

to php dot net at reinsveien dot com:

if you know the domain the file should be coming from then you can parse the variable for the domain and make sure that it matches the domain you expect, example:

<?php
$path
="/full/path/to/script/";
if (
getdomain($path) == 'yourdomain'){
     include(
$path.'somefile.php');
}
?>

this should prevent remote execution of any malicious script
lholst+phpnet at students dot cs dot uu dot nl
09-May-2006 04:15
What cavarlier refers to is that on some editors, UTF-8 files are prefixed with a BOM (Byte Order Mark), an invisible marker three bytes in size, which are output by PHP if it encouters them (which is before the <?php on the first line). Notepad is particularly notorious creating these.

However, any decent editor (e.g. Notepad2) can save UTF-8 files without BOM, and if you do that the first <?php tag will truly be on the first character of the file.

So this does not mean that UTF-8 cannot be used by PHP.
cavarlier [at] hotmail [dot] com
23-Apr-2006 04:59
please note when you include a (utf-8) encoded file, this will be sufficient to send headers even if it doesnt contain any line breaks
stalker at ruun dot de
10-Jan-2006 09:55
a simple function to recursively include e.g. the include-directory of your site and its subdirs:

<?php
function includeRecurse($dirName) {
    if(!
is_dir($dirName))
        return
false;
   
$dirHandle = opendir($dirName);
    while(
false !== ($incFile = readdir($dirHandle))) {
        if(
$incFile != "."
          
&& $incFile != "..") {
            if(
is_file("$dirName/$incFile"))
                include_once(
"$dirName/$incFile");
            elseif(
is_dir("$dirName/$incFile"))
               
includeRecurse("$dirName/$incFile");
        }
    }
   
closedir($dirHandle);
}
?>
php at bucksvsbytes dot com
04-Oct-2005 04:31
The documentation should make it clearer that the include argument is not a site path (i.e. not relative to the document root or to any web server defined aliases), but rather a path on the host relative to the calling script's directory.
Jesper Juhl
15-Aug-2005 12:14
If you want to prevent direct access to some files and only allow them to be used as include files by other scripts, then an easy way to accomplish that is to check a define in the include file.

Like this.

includefile.php
---
<?php
defined
('_VALID_INCLUDE') or die('Direct access not allowed.');

/* rest of file */

?>

script.php
---
<?php
define
('_VALID_INCLUDE', TRUE);
include(
'includefile.php');

/* rest of file */

?>
ignacio esviza
20-Jul-2005 06:10
Hi, there...

I've use this in order to grab the output from an include() but without sending it to the buffer.

Headers are not sent neither.

<?php
function include2($file){
   
   
$buffer = ob_get_contents();
    include
$file;
   
$output = substr(ob_get_contents(),strlen($buffer));
   
ob_end_clean();
   
   
ob_start();
    echo
$buffer;
   
    return
$output;
   
}
?>
Ethilien
19-Jul-2005 04:04
Another way of getting the proper include path relative to the current file, rather than the working directory is:

<?php
include realpath(dirname(__FILE__) . "/" . "relative_path");
?>
Berenguer Blasi
04-Jul-2005 10:07
When working with a well organized project you may come across multiple problems when including, if your files are properly stored in some nice folders structure such as:

 - src
  - web
  - bo
 - lib
 - test
 - whatever

as the include path's behaviour is somehow strange.

The workaround I use is having a file (ex: SiteCfg.class.php) where you set all the include paths for your project such as:

$BASE_PATH = dirname(__FILE__);
$DEPENDS_PATH  = ".;".$BASE_PATH;
$DEPENDS_PATH .= ";".$BASE_PATH."/lib";
$DEPENDS_PATH .= ";".$BASE_PATH."/test";
ini_set("include_path", ini_get("include_path").";".$DEPENDS_PATH);

Make all paths in this file relative to IT'S path. Later on you can import any file within those folders from wherever with inlude/_once, require/_once without worrying about their path.

Just cross fingers you have permissions to change the server's include path.
18-May-2005 12:10
Thought you can figure it out by reading the doc, this hint might save you some time. If you override include_path, be sure to include the current directory ( . ) in the path list, otherwise include("includes/a.php") will not search in the current script directory.

e.g :

if(file_exists("includes/a.php"))
   include("includes/a.php")

The first line will test to true, however include will not find the file, and you'll get a "failed to open stream" error
php at REMOVEMEkennel17 dot co dot uk
03-May-2005 09:20
As stated above, when using return() to terminate execution of an included file, any functions defined in the file will still be defined in the global scope, even if the return() occurs before their definition.

It should be noted that class definitions behave in the same way.
morris.php <A T> it-solutions.org
28-Apr-2005 09:31
Something not previously stated here - but found elsewhere - is that if a file is included using a URL and it has a '.php' extension - the file is parsed by php - not just included as it would be if it were linked to locally.

This means the functions and (more importantly) classes included will NOT work.

for example:

include "http://MyServer.com/MyInclude.php";

would not give you access to any classes or functions within the MyInclude.php file.

to get access to the functions or classes you need to include the file with a different extension - such as '.inc' This way the php interpreter will not 'get in the way' and the text will be included normally.
gillis dot php at TAKETHISAWAY dot gillis dot fi
14-Apr-2005 06:47
This is not directly linked to the include function itself. But i had a problem with dynamically generated include-files that could generate parse errors and cause the whole script to parse-error.

So as i could not find any ready solution for this problem i wrote the mini-function. It's not the most handsome solution, but it works for me.

<?php
function ChkInc($file){
   if(
substr(exec("php -l $file"), 0, 28) == "No syntax errors detected in"){
   return
true;
   }else{
   return
false;
   }
}
?>

if someone else has a better solution, do post it...

Note. remember that this function uses unchecked variables passed to exec, so don't use it for direct user input without improving it.

//Gillis Danielsen
dragon at wastelands dot net
10-Dec-2004 09:30
The __FILE__ macro will give the full path and name of an included script when called from inside the script.  E.g.

<? include("/different/root/script.php"); ?>

And this file contains:
<? echo __FILE__; ?>

The output is:
/different/root/script.php

Surprisingly useful :>  Obviously something like dirname(__FILE__) works just fine.
mattcimino at gardiners dot com
11-Aug-2004 09:47
To avoid painfully SLOW INCLUDES under IIS be sure to set "output_buffering = on" in php.ini. File includes dropped from about 2 seconds to 0 seconds when this was set.
durkboek A_T hotmail D_O_T com
03-Jun-2004 08:09
I would like to emphasize the danger of remote includes. For example:
Suppose, we have a server A with Linux and PHP 4.3.0 or greater installed which has the file index.php with the following code:

<?php
// File: index.php
include ($_GET['id'].".php");
?>

This is, of course, not a very good way to program, but i actually found a program doing this.

Then, we hava a server B, also Linux with PHP installed, that has the file li