【问题标题】:PHP include files from another directory that also include filesPHP包含来自另一个目录的文件,该目录也包含文件
【发布时间】:2013-05-03 08:00:22
【问题描述】:

我在多个文件中有包含,我最近创建了一个新目录,但我的一些包含无法正常工作。

例如,我在位于 example.com/c/postpage.php 的 postpage.php 中包含此内容:

include '../includes/overall/header.php';

它进入根目录并包含 header.php 但我的问题是 header.php 还包含未包含的文件。

header.php 中的代码是:

include 'includes/head.php';

不工作

如果我将 header.php 更改为:

include '../includes/head.php';

然后它会破坏我网站的其余部分,而仅适用于 postpage.php

欢迎任何建议。

【问题讨论】:

    标签: php include directory


    【解决方案1】:

    防止可能破坏相对路径的 CWD 更改的最佳方法是使用绝对路径包含文件。

    一个简单的方法是使用__DIR__ 常量。

    例子:

    文件结构:

    serverRoot (/)
        |-usr
            |-local
                |-www
                    |-index.php
                    |-bootstrap.php
                    |-includes
                        |-a.php
                        |-overall
                            |-b.php
                            |-c.php
    

    让我们这么说:

    • index.php 包括 bootstrap.phpa.php
    • a.php 包括 b.php
    • bootstrap.php 包括 c.php

    index.php

    $basedir = realpath(__DIR__);
    include($basedir . '/bootstrap.php');
    include($basedir . '/includes/a.php');
    

    一个.php

    global $basedir;
    include($basedir . '/includes/overall/b.php');
    

    bootstrap.php

    global $basedir;
    include($basedir . '/includes/overall/c.php');
    

    【讨论】:

    • $basedir 将在 a.php 和 bootstrap.php 中包含相同的值,即使它在完全不同的文件中声明?
    • 这就像我的意思......只是一种更好的方法。这应该可以解决它。
    • 是的,它就像在全局范围内声明的任何其他变量一样。您在脚本的入口处声明它(通常是 index.php 文件)并在整个脚本中使用它
    • 我真的很喜欢这种方法。我可能会开始在我的网站上使用它。
    • 你这行得通,只是在全局变量中添加。非常感谢
    【解决方案2】:

    您可以查看 PHP 文档的这一部分: http://www.php.net/manual/en/function.include.php

    根据给定的文件路径包含文件,或者,如果没有给出, include_path 指定。如果文件不在 include_path, include 将最终签入调用脚本自己的 目录和失败前的当前工作目录。

    我建议你:

    • 包含在绝对路径中(不推荐,又快又脏)
    • 更改您的 include_path (php.ini),这样您就不会遇到任何问题!
    • 设置自动加载系统http://php.net/manual/en/language.oop5.autoload.php(但更多的是用于类,可能对您没有帮助,但知道它的存在很重要)
    • 如果您有一个名为 all 的唯一 PHP 文件“入口”(“引导文件”),则使用 _DIR_ 常量时间(应该是这样!)

    另外,当你说:

    例如,我的 postpage.php 中有这个包含,它位于 example.com/c/postpage.php:

    请务必充分理解“路径”URL (example.com/foo) 和磁盘上的路径文件可以完全不同,并且完全不链接。

    因此,在您的情况下,由于您似乎有一个目录用于布局内容(页眉/页脚/...),而另一个目录可能用于模板,最简单的方法可能是在 php.ini 中添加这两个路径.

    然后只需致电:include('head.php'),您就完成了。

    你也可以在你的include_path中添加你项目的基本目录,然后调用include('includes/overall/head.php')

    【讨论】:

      【解决方案3】:

      我通过在每个页面的开头创建一个变量来做到这一点。该变量只是顶级目录的路径。

      示例...

      而不是

       include 'includes/head.php';
      

      使用:

       $pathToRoot = '../';
       include $pathToRoot.'includes/head.php';
      

      但您必须在每个页面的顶部创建此变量并更改所有 include 和 require 语句。

      【讨论】:

      • 对,但我的大多数页面都不想将包含发送到目录中。我想我问的可能是不可能的
      【解决方案4】:
      include "include/header.php";
      include "include/head.php";
      

      如果你是从其他文件夹中选择文件,那么编码将是这样的

      include "foldername/filename.php";
      

      【讨论】:

        猜你喜欢
        • 2014-03-17
        • 2011-11-26
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多