我的previous question提出了一些讨论,这些讨论暗示我使用
之类的错误require_once($_SERVER['DOCUMENT_ROOT'] . '/proj/database/database-common.php');
并且应该使用
require_once(dirname(__FILE__) . '/database/database-common.php');
但是,我有一个多层次的层次结构和一些可以从任何级别调用的常用功能(数据库,错误处理等) - 我该如何处理?例如,我的错误处理需要来自$ _SERVER ['DOCUMENT_ROOT'] \ css \ my.css
的CSS文件如果我没有$_SERVER['DOCUMENT_ROOT']
作为锚点,我可以使用其他东西吗?如果没有,我如何处理一个公共文件可能希望包含另一个文件,但不知道它本身包含在哪个级别?
例如:
root
`- databse
`- validation
如果validation / common.php想要包含database / database_common.php thhen,没有锚,则validation / common.php无法知道database_common.php的路径 not {{1}如果验证/ common.php是从根目录中的文件中提出的(这是一个简化的例子)
我的philiosophy总是要求文件中的文件使用它,所以我不能只在根目录文件中包含everthing ....
有些人可以为我澄清最好的实践吗?感谢
答案 0 :(得分:2)
您可以使用在所有其他文件中使用的引导程序文件,并在那里定义所有全局参数,例如
# bootstrap.php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__)));
并在每个需要包含其他文件的文件中要求此主文件,以便您的以下要求将成为
require 'path/to/bootstrap.php';
require APPLICATION_PATH . '/database/common.php';
这将部分解决您的问题,但保持事物一致,唯一需要更改的部分,但您可以使用相对路径来保持代码的可移植性。
我不会使用include_path
更改,因为它会降低路径解析速度,因为php将搜索包含路径中的所有目录,而stat
是最昂贵的系统调用之一。示例:如果您有此包含路径
.:/dir1:/dir2:/dir3
并且您需要一个名为foo.php
的文件,该文件位于dir3
php中,将进行以下四次静态调用:
./foo.php
/dir1/foo.php
/dir2/foo.php
/dir3/foo.php
因此,在需要文件时应始终使用绝对路径,并且应将包含路径限制为一个或两个路径。
或者,如果您正在使用OOP,则可以始终使用autoloading for your classes,这样就无需使用文件,并且运行良好。在Zend Framework autoloader
中给出了这种技术的一个很好的例子答案 1 :(得分:0)
在php.ini中设置include_path。这将搜索包含。很好地定义您的目录结构,以便覆盖文件被覆盖。
在你的php.ini中设置以下内容:
include_path=".:/dir/first:/dir/second"
这意味着搜索include和require文件。 (当前目录,然后是/ dir / first,最后是/ dir / second
所以require_once'database / common.php'可以在:
中找到/dir/first/database/common.php
/dir/second/database/common.php