使用PHP的相对路径包含文件?

时间:2011-01-19 16:09:12

标签: php

在开发我的网站时,我通过调用一个名为includes的文件来调用我的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");一旦我部署到网站就不能再工作了吗?

4 个答案:

答案 0 :(得分:6)

您可以通过执行以下操作来包含相对于includes.php目录的文件:

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

答案 1 :(得分:1)

这里有两条建议:

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

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

答案 2 :(得分:1)

首先,不要滥用那样的三元语法。您可以使用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

答案 3 :(得分:0)

首先关闭:我放弃DS,它是BS(ehe)。 Windows支持C:/wamp/wwwC:\wamp\www :-)即使C:\wamp\www/project也没问题。

如果找到includes.php,说lib/includes.php(相对于项目根目录),请执行以下操作:

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

这将动态设置SITE_ROOT