【问题标题】:How to include PHP files that require an absolute path?如何包含需要绝对路径的 PHP 文件?
【发布时间】:2008-08-07 03:46:47
【问题描述】:

我的目录结构如下;

脚本.php

inc/include1.php
inc/include2.php

对象/object1.php
对象/object2.php

肥皂/soap.php

现在,我在script.php/soap/soap.php 中都使用了这些对象,我可以移动它们,但出于特定原因我想要这样的目录结构。执行script.php 时,包含路径是inc/include.php,执行/soap/soap.php 时是../inc,绝对路径有效,/mnt/webdev/[project name]/inc/include1.php... 但如果我想将目录移动到其他位置,这是一个丑陋的解决方案。

那么有没有办法使用相对路径,或者以编程方式生成"/mnt/webdev/[project name]/"

【问题讨论】:

    标签: php


    【解决方案1】:

    这应该可以工作

    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    
    include "$root/inc/include1.php";
    

    编辑:添加了aussieviking的改进

    【讨论】:

    • 小心,只有当您通过填充DOCUMENT_ROOT的网络服务器执行脚本时,这才有效
    • 只是一个问题,为什么 $_SERVER["DOCUMENT_ROOT"] 的 realpath()?这不应该总是输出规范路径吗?
    【解决方案2】:

    您可以使用相对路径。试试__FILE__。这是一个 PHP 常量,它总是返回它所在脚本的路径/文件名。所以,在soap.php,你可以这样做:

    include dirname(__FILE__).'/../inc/include.php';
    

    完整路径和文件名 文件。如果在包含内使用,则 返回包含文件的名称。 自 PHP 4.0.2 起,__FILE__ 始终 包含一个绝对路径 符号链接在旧版本中已解决 它包含相对路径的版本 在某些情况下。 (source)

    另一种解决方案是在您的 httpd.conf 或 .htaccess 文件中设置 包含路径

    【讨论】:

    • 我认为您应该在引用表达式的开头添加一个/,以将..FILE 名称分开。
    • 请注意,从 PHP 5.3.0 开始,您可以使用魔术常量 __DIR__ 而不必使用 dirname(__FILE__)(PHP docs)
    • include dirname(__FILE__).'/../inc/include.php'; 不要忘记相对路径前的“/”。
    【解决方案3】:

    另一种完全不需要包含的处理方法是使用autoload 功能。包括脚本所需的一切“以防万一”可能会妨碍性能。如果您的 include 都是类或接口定义,并且您希望仅在需要时加载它们,则可以使用自己的代码重载 __autoload() 函数以找到适当的类文件并仅在调用时加载它。这是手册中的示例:

    function __autoload($class_name) {
        require_once $class_name . '.php';
    }
    
    $obj  = new MyClass1();
    $obj2 = new MyClass2(); 
    

    只要您相应地设置了您的 include_path 变量,您就无需再次包含类文件。

    【讨论】:

      【解决方案4】:

      看看http://au.php.net/reserved.variables

      我认为您要查找的变量是:$_SERVER["DOCUMENT_ROOT"]

      【讨论】:

        【解决方案5】:

        您可以使用项目根目录的路径定义一个常量,然后将其放在路径的开头。

        【讨论】:

          【解决方案6】:

          另一个与 Kevin 相关的选项是使用 __FILE__,但替换其中的 php 文件名:

          <?php
          
          $docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
          require_once($docRoot . '/lib/include.php');
          
          ?>
          

          我已经用了一段时间了。唯一的问题是有时你没有$_SERVER['SCRIPT_NAME'],但有时还有另一个类似的变量。

          【讨论】:

            【解决方案7】:

            我发现这个效果很好!

            function findRoot() { 
                return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
            }
            

            用途:

            <?php
            
            function findRoot() {
                return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
            }
            
            include(findRoot() . 'Post.php');
            $posts = getPosts(findRoot() . 'posts_content');
            
            include(findRoot() . 'includes/head.php');
            
            for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
                $posts[$i]->displayArticle();
            }
            
            include(findRoot() . 'includes/footer.php');
            
            ?>
            

            【讨论】:

              【解决方案8】:

              我认为最好的方法是将您的包含放在您的 PHP 包含路径中。根据您的设置,有多种方法可以做到这一点。

              那你可以简单的参考

              require_once 'inc1.php';
              

              从任何文件内部,无论它是在您的包含文件中还是在您的 Web 可访问文件中,或任何级别的嵌套子目录中。

              这允许您将包含文件放在 Web 服务器根目录之外,这是一种最佳做法。

              例如

              site directory
                  html (web root)
                      your web-accessible files
                  includes
                      your include files
              

              另外,查看 __autoload 以延迟加载类文件

              http://www.google.com/search?q=setting+php+include+path

              http://www.google.com/search?q=__autoload

              【讨论】:

                【解决方案9】:
                require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
                

                我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。

                例如,假设我有这个文件树:

                domain.com/aaa/index.php
                domain.com/bbb/ccc/ddd/index.php
                domain.com/_resources/functions.php

                我可以从任何地方包含functions.php文件,只需复制粘贴

                require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
                

                如果您需要多次使用此代码,您可以创建一个返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) 部分的函数。然后只需将此函数插入​​到您包含的第一个文件中。我有一个“initialize.php”文件,我包含在每个 php 页面的最顶部,其中包含此函数。下次我必须包含文件时,实际上我只是使用该函数(命名为path_back):

                require(path_back()."/_resources/another_php_file.php");
                

                【讨论】:

                  【解决方案10】:

                  @Flubba,这是否允许我在包含目录中包含文件夹?平面包含目录让我做噩梦。因为整个对象目录应该在 inc 目录中。

                  哦,是的,当然。所以比如我们使用单层子文件夹,一般:

                  require_once('library/string.class.php')
                  

                  在真正高流量的网站中,你需要小心过度依赖包含路径,因为 php 必须搜索当前目录,然后是包含路径上的所有目录,以查看你的文件是否存在并且如果您受到重创,这可能会减慢速度。

                  因此,例如,如果您正在执行 MVC,则将应用程序目录的路径放在包含路径中,然后在表单中指定引用事物

                  'model/user.class'
                  'controllers/front.php'
                  

                  或其他。

                  但一般来说,它只是让您在 PHP 中使用非常短的路径,可以在任何地方工作,而且它比所有 realpath 文档根目录更容易阅读。

                  其他人建议的那些基于脚本的替代方案的好处是它们可以在任何地方工作,即使是在共享的盒子上;设置包含路径需要更多的思考和努力,但正如我提到的,您可以开始使用最酷的 __autoload。

                  【讨论】:

                    【解决方案11】:

                    如果您要在应用程序的大多数文件中包含特定路径,请为您的根文件夹创建一个全局变量。

                    define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
                    or 
                    define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
                    

                    现在这个全局变量“APPLICATION_PATH”可用于包含所有文件,而不是每次包含新文件时调用 realpath()。

                    前:

                    include(APPLICATION_PATH ."/config/config.ini";
                    

                    希望对你有帮助 ;-)

                    【讨论】:

                      猜你喜欢
                      • 2012-11-28
                      • 1970-01-01
                      • 2014-05-19
                      • 2013-10-10
                      • 2012-07-28
                      • 2015-11-08
                      • 2014-03-12
                      • 1970-01-01
                      相关资源
                      最近更新 更多