【问题标题】:Including files using relative paths with PHP?包括使用 PHP 相对路径的文件?
【发布时间】:2011-01-19 16:09:11
【问题描述】:

在开发我的网站时,我通过调用一个名为 include 的文件来调用我的 php 文件中的所有包含。

这个文件的代码看起来像这样:(我改编自 Lynda 教程)

defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);

defined('SITE_ROOT') ? null :
    define('SITE_ROOT', 'C:'.DS.'wamp'.DS.'www'.DS.'ArmyCreator');

defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.DS.'includes');
defined('PUB_PATH') ? null : define('PUB_PATH', SITE_ROOT.DS.'public');


// load config file first
require_once(LIB_PATH.DS."helper".DS.'config.php');

现在由于我正在部署我的网站,我不知道如何声明 SITE_ROOt 以使其正常工作?

编辑

这样的代码:require_once("../../includes/helper/initialize.php"); 在我部署到网站后不再工作正常吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以通过以下方式包含与includes.php 目录相关的文件:

    <?
    $basePath = dirname(__FILE__);
    require_once($basePath . "relative/path/from/basePath"); // replace the string with your real relative path
    

    【讨论】:

    • 不幸的是 IDE 不喜欢路径中的变量 :(
    • __DIR__,自 PHP 5.3.0 起。
    • 我还没有使用 5.3。 @dorkitude。我使用了这个,但我看不出它是否有效,因为我意识到我使用 require_once("../../includes/helper/initialize.php"); 制作的所有公式也不行。
    • 你应该像我的例子一样添加一个$basePath,而不是做相对路径
    【解决方案2】:

    这里有两个建议:

    1. 你会希望SITE_ROOT 是你的文件所在目录的绝对路径。例如,在上面的代码中,这个目录是C:\wamp\www\ArmyCreator。如果您知道目录,则可以手动定义它,或者使用预定义的 __DIR__ 常量 (PHP 5.3+) 动态定义,如果您还没有使用 5.3,则可以使用 dirname(__FILE__)

    2. 一次包含一堆文件通常被认为是不好的做法,应该使用自动加载。这将为您提供更好的性能以及定义良好的目录布局和命名方案,从而产生更好的代码。为此,您可以使用spl_autoload_register() 函数。

    【讨论】:

      【解决方案3】:

      首先,不要像那样滥用三元语法。除了defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);,您可以使用OR 运算符(它将在布尔真结果上短路):

      defined('DS') OR define('DS', DIRECTORY_SEPARATOR);
      

      其次,如果这是在您知道其位置的引导文件中,只需使用dirname(__FILE__)

      defined('SITE_ROOT') OR define('SITE_ROOT', dirname(__FILE__));
      

      否则,如果您知道根的相对位置,则可以使用多个dirname 调用。所以如果是当前目录的父目录:

      defined('SITE_ROOT') OR define('SITE_ROOT', dirname(dirname(__FILE__)));
      

      请勿使用 $_SERVER['DOCUMENT_ROOT']cwd() 或硬编码您的路径。始终使用dirname(__FILE__) 来确定绝对路径。有关原因的更多信息,请参阅This Answer

      【讨论】:

      • 甚至比or 更干净的是if (!defined('...')) { define('...') }
      • 非常正确@mfonda,但冗长和混乱之间有一条线。拥有一大堆 if 语句(每条语句占用 2 到 3 行,因为我不知道允许 inline-if 语句的单一编码标准)比它可能的价值更混乱......但对于每个他们自己的...
      【解决方案4】:

      首先:我会放弃 DS,它是 BS (ehe)。 Windows 同时支持C:/wamp/wwwC:\wamp\www :-) 即使C:\wamp\www/project 也可以。

      如果includes.php 位于,例如lib/includes.php(相对于您的项目根目录),则执行以下操作:

      define('SITE_ROOT', realpath('../'));
      

      这将动态设置SITE_ROOT

      【讨论】:

      • DS 不是 BS。当然,windows 支持这两种路径语法,但它是模棱两可的,与realpath() 的结果不匹配。我确实认为在 Windows 系统上盲目使用 / 是非常糟糕的做法。但这只是我的 0.02 美元...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2013-04-09
      • 2015-07-21
      • 2014-11-15
      • 2012-10-07
      • 2014-04-24
      相关资源
      最近更新 更多