30

所以,检查这个目录结构

  • /include_one.php
  • /include_two.php
  • /目录/main_file.php

假设我在/directory/main_file.php并且我在include_one.phpinclude('../include_one.php');内部调用,以包含include_two.php。我需要打电话还是?include('include_two.php);include('../include_two.php');

所以我的问题是:包含文件时,“相对包含路径”是否转移到包含文件,还是保留在主包含文件中?

我知道最好的选择是拥有一个包含 root_path 的 config.php,但是在这个阶段这是不可能的。


更新:
所以,我不确定谁是对的,因为这是我的测试

目录结构

/include.php
/start/start.php
/folder1/includeone.php
/folder1/folder2/includetwo.php

这是每个文件的内容

开始.php

<?php 
  echo 'including ../include.php<br />';
  include('../include.php');
?>

包含.php

<?php 
  echo 'including folder1/includeone.php<br />';
  include('folder1/includeone.php');
?>

包含一个.php

<?php 
  echo 'including folder2/includetwo.php<br />';
  include('folder2/includetwo.php');
?>

包含两个.php

<?php 
  echo 'done<br />';
?>

输出是

包括 ../include.php
包括 folder1/includeone.php
包括 folder2/includetwo.php
完成

4

4 回答 4

59

“相对包含路径”不会转移到包含的文件......这意味着使用相对路径通常会以失败告终。

我几乎一直使用的一个更好的解决方案是始终使用绝对路径——您可以使用 , 混合相对路径和绝对路径__DIR__,以获取包含写入文件的目录。


例如,在 中include_one.php,您将使用:

require_once __DIR__ . '/include_two.php';

要包含include_two.phpinclude_one.php.


而且,在 中main_file.php,您将使用:

require_once __DIR__ . '/../include_one.php';

包含include_one.php一个目录的文件。


这样,无论从哪个文件调用它们,您的包含都将起作用。

于 2010-07-26T10:42:17.367 回答
2

包含路径相对于包含链中的第一个文件。

确保正确包含路径的一个好方法是始终从文档根目录包含。

这样做是这样的:

include $_SERVER['DOCUMENT_ROOT'] . '/folder1/folder2/includetwo.php';

于 2019-06-03T08:15:04.590 回答
1

我正在使用这段代码:

if(!isset($TO_HOME_DIR)) $TO_HOME_DIR="../"; 

我包括一个文件:

include_once($TO_HOME_DIR."common/include_one.php");

使用if(!isset($TO_HOME_DIR)),将文件包含到包含文件中到包含文件到包含中的程度并不重要......只使用第一个文件的 - 和主文件的 - $TO_HOME_DIR 声明。

这种方法的第二个好处是,如果你改变文件目录,你只需要改变一行代码;$TO_HOME_DIR 声明。:)

于 2017-04-03T21:03:17.983 回答
0

PHP 中包含如何工作的两个演示

我在 2010 年,作者在他的问题中写道:

所以,我不确定谁是对的,因为这是我的测试......

并在评论中:

仍然没有回答我的更新...

所以我建议我的测试来了解 PHP 是如何包含工作的。版本 5 和 7 的结果相同。

测试 1

文件和目录:

  1. /index.php
    <?php
    include 'subdirectory/index.php';
  1. /subdirectory/index.php
    <?php
    include 'test.php';
  1. /subdirectory/test.php
    <?php
    echo __FILE__;

输出:

/子目录/test.php

该测试运行良好,因为每个包含只有一个候选人

更新问题的测试也满足此要求。这也是它运作良好的原因。

测试 2

让我们复制test.php到主根目录。所以新的项目结构如下:

/index.php
/test.php
/subdirectory/index.php
/subdirectory/test.php

现在输出变得不同了::

/test.php

第二个测试有另一个结果,因为指令有两个候选项,include 'test.php';PHP自己选择要包含的文件。

这就是为什么接受答案的作者建议的做法可以使项目免于意外。

于 2021-08-31T12:05:15.440 回答