我想如果我能做得更好,我会问。
在我的本地(WAMP)我的所有网站都在www文件夹中。 (C:\wamp\www
)
现在我在包含文件时执行此操作:
require_once("".$_SERVER['DOCUMENT_ROOT']."/lib/config.php");
当我在本地工作并将网站上传到网站主机时,我想确保路径不会中断
有人可以告诉我,我是否应该这样做?
我想确保最大程度的兼容性;例如,如果我将站点从本地移动到我决定使用的任何Web主机,或者例如,我从一个主机移动到另一个主机,则意味着路径不会中断。
也许还有一种防弹方式可以做到这一点?
答案 0 :(得分:2)
使用$_SERVER['DOCUMENT_ROOT']
的问题在于,如果将PHP脚本上下移动到目录级别,它将会中断。而是使用它:
require_once(dirname(__FILE__) . "/lib/config.php");
__FILE__
是脚本的绝对路径。 dirname()
删除最后一个路径组件(脚本文件名),以便您可以向其添加其他路径组件,例如/lib/config.php
或/../../lib/config.php
或其他。这将适用于所有地方。
PHP 5.3引入了dirname(__FILE__)
的简写,称为__DIR__
,但这在< 5.3中不起作用。
答案 1 :(得分:2)
你应该看到Include path。因为set_include_path很有用。
答案 2 :(得分:1)
这适用于包含配置文件(虽然我会删除开头的引号)
require_once( $_SERVER['DOCUMENT_ROOT'] . "/lib/config.php" );
如果您从一堆不同的目录中包含配置文件,这实际上是唯一的方法。
在更大的项目ID上说“大多数”开发人员都有一个front controller来加载所有脚本。这个前端控制器加载配置文件,因为它的同一个文件总是包含配置文件,所以不需要$_SERVER['DOCUMENT_ROOT']
。
答案 3 :(得分:1)
我通常做的是使用一些非常基本的常量制作1个配置文件(可能包含其他文件):
define('PROJECT_ROOT', dirname(dirname(__FILE__))); // or dirname(__DIR__) for PHP 5.3
define('PROJECT_WEB', $_SERVER['DOCUMENT_ROOT']);
// etc
我的其他文件/包含将基于那些非常简单的常量。我永远不需要相对路径,也不需要include_path,因为PROJECT_ROOT
和PROJECT_WEB
都是'真实'/绝对。
其他有用(?)常量为PROJECT_LOGIC
和/或PROJECT_CONTROLLERS
和/或PROJECT_3RD_PARTY
等。