Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么两级PHP只包含对当前目录的工作?_Php_Php Include - Fatal编程技术网

为什么两级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)
?>