在开发我的网站时,我通过调用一个名为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");
一旦我部署到网站就不能再工作了吗?
答案 0 :(得分:6)
您可以通过执行以下操作来包含相对于includes.php目录的文件:
<?
$basePath = dirname(__FILE__);
require_once($basePath . "relative/path/from/basePath"); // replace the string with your real relative path
答案 1 :(得分:1)
这里有两条建议:
您希望SITE_ROOT
成为文件所在目录的绝对路径。例如,在上面的代码中,此目录为C:\wamp\www\ArmyCreator
。如果您知道目录,可以手动定义,或者使用预定义的__DIR__
常量(PHP 5.3+)动态定义,或者如果您尚未使用5.3,则可以dirname(__FILE__)
。
一次性包含一堆文件通常被认为是不好的做法,而应该使用自动加载。这将为您提供更好的性能以及明确定义的目录布局和命名方案,从而产生更好的代码。为此,您可以使用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/www
和C:\wamp\www
:-)即使C:\wamp\www/project
也没问题。
如果找到includes.php
,说lib/includes.php
(相对于项目根目录),请执行以下操作:
define('SITE_ROOT', realpath('../'));
这将动态设置SITE_ROOT
。