包含路径的问题

时间:2011-08-16 03:49:52

标签: php

我的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 ....

有些人可以为我澄清最好的实践吗?感谢

2 个答案:

答案 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