【问题标题】:How to get these PHP includes working?如何让这些 PHP 包括工作?
【发布时间】:2011-09-08 03:46:00
【问题描述】:

我有以下文件结构:

/
+--- inc/
|    +--- lib1.php
+--- inc2/
|    +--- lib2.php
|    +--- view2.php
+--- view1.php

view1.php 和 view2.php 都包含 lib2.php。 Lib2.php 包括 lib1.php。图形化:

View1.php ---\
             +---> Lib2.php ---> Lib1.php
View2.php ---/

但是我不能让它工作,因为搜索路径很不稳定。如果我尝试包含“../lib1.php”,那么只有 view2.php 有效。如果我尝试包含“inc/lib1.php”,那么只有 view1.php 有效。另一个视图总是抱怨找不到文件。

正确的处理方法应该是什么?

【问题讨论】:

    标签: php path include


    【解决方案1】:

    如果您使用 php >= 5.3,您可以使用 __DIR__ 来构建路径。如果没有,请使用dirname(__FILE__) 所以在 lib2.php 中,放这个:

    require_once(__DIR__ . '../inc/lib1.php');
    

    【讨论】:

    • 如果你只使用'../',它是相对于执行脚本的工作目录,所以使用__FILE____DIR__ 是实现你实际目标的简单方法寻找。文档在这里:php.net/manual/en/language.constants.predefined.php
    • 很高兴你喜欢它!很高兴他们介绍了__DIR__,其他解决方案看起来有点奇怪。
    • 每个人都喜欢__DIR__,看来是时候了 :)
    • @hakre “所以在 lib2.php 中,只要放这个 [...]” - 有问题。您正在指导读者添加相当于自包含的内容,这肯定会使他们感到困惑。为了清楚起见,您可能需要进行编辑。
    • @Obsidian_ :我想你是在跟我说话,很高兴你注意到了这个问题!
    【解决方案2】:

    由于依赖相对路径是行不通的,我认为可能的解决方案是使用绝对路径。将$system_path = "/"声明为全局变量,这样就可以随时根据系统路径包含进来。

    【讨论】:

    • 即使这样有效,它也阻止了代码的可移植性,例如当你把它放到另一个系统上时。
    • 实际上最好将其作为常量而不是全局变量。
    【解决方案3】:

    在您面向用户的文件中,像这样定义一个常量(假设这里是 PHP 5.3):

    <?php
    define('ROOT_INCLUDE_PATH', __DIR__ . '/');
    

    现在,在面向用户的文件包含的项目中的任何文件中,您只需使用简单的包含。

    下一个 sn-p 将是 view1.php:

    <?php
    define('ROOT_INCLUDE_PATH', __DIR__ . '/');
    // ...
    include ROOT_INCLUDE_PATH . 'inc/lib1.php';
    include ROOT_INCLUDE_PATH . 'inc2/lib2.php';
    

    这将是 view2.php(请注意,我们在这里使用 dirname() 来使根路径成为目录):

    <?php
    define('ROOT_INCLUDE_PATH', dirname(__DIR__) . '/');
    // ...
    include ROOT_INCLUDE_PATH . 'inc/lib1.php';
    include ROOT_INCLUDE_PATH . 'inc2/lib2.php';
    

    这意味着您的包含可以包含其他包含,而无需任何修改;只要您在面向用户的文件中适当地定义根包含路径,一切都很好。

    【讨论】:

    • 这个项目根路径设计+1,但是“面向用户的文件”是什么意思?
    • @greg0ire 用户直接与之交互的任何内容;它与包含文件截然相反,包含文件是用户从不访问的库文件(但在运行时包含)。它基本上是用户发送请求的页面。
    • 我是个白痴。那应该是 dirname(),而不是 basename()。 /我编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多