为什么两级PHP只包含对当前目录的工作?
让我先演示一下我的文件结构。为什么两级PHP只包含对当前目录的工作?,php,php-include,Php,Php Include,让我先演示一下我的文件结构。 /www/ myfile.php anotherC.php a/ b.php c.php myfile.php中的代码是: <?php include_once("a/b.php"); ?> <?php include_once("c.php"); ?> 最后在c.php中: <?php echo "hello i'm C.php"; ?> 现在,
/www/
myfile.php
anotherC.php
a/
b.php
c.php
myfile.php
中的代码是:
<?php
include_once("a/b.php");
?>
<?php
include_once("c.php");
?>
最后在c.php
中:
<?php
echo "hello i'm C.php";
?>
现在,当我调用www/myfile.php
时,我得到一个错误:
警告:include_once(../anotherC.php):无法打开流:没有这样的
第2行的/home/hasib/Desktop/www/a/b.php中的文件或目录
警告:include_once():为打开“../anotherC.php”失败
包含(include_path='。:/usr/share/php:/usr/share/pear')在
/home/hasib/Desktop/www/a/b.php第2行
现在我的问题是,为什么
只包含一次(“c.php”)代码>工作得很好???包含的相对路径始终是相对于主脚本执行的include()
的操作方式与将包含的数据直接剪切粘贴到主脚本中的方式基本相同。因此,在执行sub-include时,它们使用的是myFile.php
脚本的工作目录,而不是b.php
或c.php
的工作目录
您的子脚本需要在其ICNLDue中有一个绝对路径,或者至少有某种“我到底在哪里”的确定代码,例如include(\uu FILE\uu.'c.php')
我能想到的进行此工作的唯一原因是/www/a
在include\u路径中。这意味着include_once(“c.php”)
将首先查找/www/c.php
(因为这是当前的工作目录),然后查找将被找到并工作的/www/a/c.php
但是,include\u once(“./c.php”)
明确表示只查找当前工作目录,当然,由于文件不在那里,它将无法工作。
如果在include_路径中找不到该文件,include将在失败之前最终签入调用脚本自己的目录和当前工作目录
如果定义了路径-无论是绝对路径(在Windows或/在Unix/Linux系统上以驱动器号或\开头)还是相对于当前目录(以.or..开头)-include_路径都将被完全忽略。例如,如果文件名以../开头,解析器将在父目录中查找请求的文件
示例中的“调用脚本”是b.php,显然它的directoy是“/www/a/”
您可以使用getcwd()获取“当前目录”,在myfile.php或b.php中,它将返回“/www/”
所以当包含_once(“c.php”);它首先在调用脚本的目录中查找c.php,即/www/a/,然后成功地获得c.php
当包含_一次(“../anotherC.php”),它只在当前目录的相对路径中查找anotherC.php,当前目录是/www/,因此它在/中查找anotherC.php,/anotherC.php不存在并抛出警告。您的include\u路径设置为什么?我的建议是:使用绝对路径,从文档根开始($\u SERVER['document\u root']
)。好处是:你可以避免头痛;您可以移动文件,而无需更改实际代码中的路径;如果删除中间文件,您仍然可以从上一个文件访问所需的文件。等等。@AlexHowansky,我的include路径是::/usr/share/php:/usr/share/pears不是我知道的答案。@aleation:I使用include\u-once-dirname(\uu-FILE\uu)。“/relative/path/FILE.php”
而不是DOCUMENT\u根如果没有被Web服务器调用也可以工作。这并不能回答以下问题:为什么包含(“c.php”)
工作?是的,为什么包含(“c.php”)
工作??在浏览了php.net之后,现在我知道了如何安全地包含文件。但是,include(“c.php”)
是如何工作的,而它本不应该工作的。(据我所知,我的include路径是:/usr/share/php:/usr/share/pear
在第二种情况下,当include\u once(../anotherC.php”)
时,为什么当前目录是/www/
??它不是像你前面所说的那样是/www/a/
??(据我所知,当前目录将始终是“/www/”[在这两种情况下]当前执行的文件(myfile.php
)存在的地方。)@HasibAlMuhaimin请注意“当前目录”和“调用脚本的目录”之间的区别,您可以通过getcwd()获得“当前目录”)正如我所说,结果总是/www/as yu know.@HasibAlMuhaimin如果路径以..开头(就像../anotherC.php),php只查找到“当前目录”的相对路径
<?php
include_once("../anotherC.php"); //or include_once("./c.php"); (it won't work too)
?>