0

让我先演示一下我的文件结构。

/www/
    myfile.php
    anotherC.php
     a/
       b.php
       c.php

里面的代码myfile.php是:

<?php
    include_once("a/b.php");
?>

里面的代码b.php是:

<?php
    include_once("c.php");
?>

最后在里面c.php

<?php
   echo "hello i'm C.php";
?>

所以,当我打电话时,www/myfile.php我得到输出:

你好我是C.php

这些工作正常。但是让我b.php改成

<?php
     include_once("../anotherC.php"); //or include_once("./c.php"); (it won't work too)
?>

现在,当我打电话时www/myfile.php,我得到错误:

警告:include_once(../anotherC.php):打开流失败:第 2 行 /home/hasib/Desktop/www/a/b.php 中没有这样的文件或目录警告:include_once():打开失败'。 ./anotherC.php' 用于在第 2 行的 /home/hasib/Desktop/www/a/b.php 中包含 (include_path='.:/usr/share/php:/usr/share/pear')

现在我的问题是,为什么include_once("c.php"); 工作完美?

4

3 回答 3

1

文件:_

如果在 include_path 中找不到该文件,则 include 最终会在失败之前检查调用脚本自己的目录和当前工作目录。

如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,或在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 . 或 .. 开头)—— include_path 将被完全忽略。例如,如果文件名以 ../ 开头,解析器将在父目录中查找请求的文件。

您示例中的“调用脚本”是 b.php ,显然它的目录是“/www/a/”。

您可以使用 getcwd() 在 myfile.php 或 b.php 中获取“当前目录”,它将返回“/www/”

所以当 include_once("c.php"); 它首先在调用脚本的目录中查找c.php,即/www/a/,并成功获取c.php。

当 include_once("../anotherC.php"); ,它只在当前目录的相对路径中查找 anotherC.php ,当前目录是 /www/ ,所以它在 / 中查找 anotherC.php , /anotherC.php 不存在并抛出警告。

于 2014-01-23T15:40:09.353 回答
0

包含相对路径总是相对于 MAIN 脚本完成。include()操作方式与将包含的数据直接剪切并粘贴到主脚本中的方式基本相同。因此,当您执行子包含时,它们使用的是myFile.php脚本的工作目录,而不是b.phpor的工作目录c.php

您的子脚本需要在其 icnldues 中有一个绝对路径,或者至少需要某种“我到底在哪里”确定代码,例如include(__FILE__ . 'c.php')

于 2014-01-23T15:23:25.590 回答
0

我能想到这项工作的唯一原因是你/www/ainclude_path. 这意味着include_once("c.php")将首先查找/www/c.php(因为那是当前工作目录),然后查找/www/a/c.php将找到并工作的目录。

但是,include_once("./c.php")明确声明只查看当前工作目录,当然,由于文件不存在,它不会工作。

于 2014-01-23T15:23:32.993 回答