【问题标题】:php nested include behaviorphp嵌套包含行为
【发布时间】:2011-02-21 01:18:57
【问题描述】:

在我的代码中的许多地方,我会做如下的事情:

file1.php:
<?php
include('../file2.php');

file2.php:
<?php
include('anotherdirectory/file3.php');

根据我尝试使用的服务器或设置,它可以设置来自“包含器”或“包含器”的相对路径。这真的很令人困惑。 所以 file1 可能会尝试包含“../anotherdirectory/file3.php”,也可能会尝试包含“anotherdirectory/file3.php”。

什么设置决定了这种行为?我想控制这个...

【问题讨论】:

    标签: php include relative-path


    【解决方案1】:

    作为 php 学习曲线上的人,我发现引用包含路径的最佳方法是通过使用内置的 $_SERVER 超全局的绝对位置,而不是相对位置。在我自己的文件中,我一直在成功使用它:

    include $_SERVER [ 'DOCUMENT_ROOT' ] . '/path_from_root/file_name.php';
    

    这样,包含的文件相对于我的调用文件位于何处并不重要,而且我不必担心手动输入我的完全合格的服务器路径。 (可能很明显..)例如,无论包含调用的嵌套程度如何,以及如果 / 当我将调用文件移动到不同的目录时,这都会起作用。

    您可以将此方法与includerequire 以及任何其他需要路径的文件相关函数一起使用。

    在相关的注释上..

    $_SERVER [ 'PHP_SELF' ]
    

    将返回当前文件的路径(相对于根目录)。我也经常用这个。

    $_SERVER 有其他有用的信息,您可能想在这里查看:

    http://php.net/manual/en/reserved.variables.server.php

    对不起,如果这是一个旧线程,我是新来的。

    编辑:您可以将此'DOCUMENT_ROOT' 保存到一个变量中以供以后使用,但根据最近的经验,我建议您不要这样做,因为您必须担心变量范围。无论当前范围如何,所写的包含行每次都会起作用。

    【讨论】:

      【解决方案2】:

      如果我需要使用相对路径,我会使用以下语法:

      include (realpath(dirname(__FILE__)."/another_folder/myfile.php"));
      

      【讨论】:

        【解决方案3】:

        我建议使用绝对路径。在保持可移植性的同时做到这一点的一个好方法是在您的 public_html/index.php 中进行这样的声明:

        define('ROOT', dirname(__FILE__));
        

        然后,您可以像这样编写包含,非常简单:

        include(ROOT.'/file.php');
        

        否则,PHP 会检查文件是否在您的 php.ini 定义的 include path 中。如果它不存在,它会尝试当前脚本的相对路径。这是不可预测且不可维护的,因为您可能嵌套地包含来自不同相对位置的文件。

        编辑:如果您经常包含很多类文件,您可能需要查看autoloading。如果您以面向对象的风格进行编程,它会使一切变得更简单。我个人很长一段时间都没有在我的代码中写过“包含”这个词。

        编辑 2:您可以使用 php.ini directive auto_prepend_file 自动将带有 ROOT 定义的单行文件包含到您的每个脚本中。

        【讨论】:

        • 请提供拒绝投票的理由,我愿意学习更好的方法。
        • 但是我必须包含将具有此“define()”的文件。所以我会回到同样的问题。
        • 好点。理想情况下,您的 index.php 会使用 mod_rewrite 将所有请求路由到适当的脚本,但这本身就是另一个问题。几乎每个 MVC(模型-视图-控制器)应用程序都这样做。
        • 在一个完美的世界里,我会把我 7 岁的应用程序构建为 MVC :) 但是谢谢。
        • 使用 auto_prepend_file 编辑了我的另一个可能解决方案的答案。
        【解决方案4】:

        使用get_include_path(),您可以看到服务器配置是什么。在大多数情况下,它看起来像这样:

        .:/usr/lib/php
        

        这意味着,php 寻找包含文件的第一个地方是包含另一个的脚本的目录。如果那里不存在,则 php 正在 /usr/php/lib 中查找。如果添加更多路径,php 也会在那里寻找匹配的文件。

        如果你包含一个包含另一个文件的文件,“根”路径是最初包含另一个文件的文件的路径。

        【讨论】:

          猜你喜欢
          • 2012-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          相关资源
          最近更新 更多