与问题包括路径

问题描述:

previous question broght了一些讨论,这表明,我说错了使用的与问题包括路径

require_once($_SERVER['DOCUMENT_ROOT'] . '/proj/database/database-common.php'); 

喜欢和应该,而是使用

require_once(dirname(__FILE__) . '/database/database-common.php'); 

,但我有一个多层级和一些常见的功能(数据库,错误处理等),可以从任何级别调用 - 我该如何处理?例如,我的错误处理需要$ _SERVER的一个CSS文件['DOCUMENT_ROOT'] \ css \ my.css

如果我没有$_SERVER['DOCUMENT_ROOT']作为定位点,我可以使用别的东西吗?如果不是,我该如何处理一个普通文件可能希望包含另一个文件,但不知道它本身被包含在哪个层面?

如:

root 
    `- databse 
     `- validation 

如果验证/的common.php要包括数据库/ database_common.php thhen,没有锚,验证/的common.php无法知道database_common.php它的路径是..\database/database_common.php如果验证/的common.php从根目录中的文件incldued(这是一个简单的例子)

我philiosophy是始终需要它使用它的文件,在文件中,所以我不能只是包括在根目录下的文件....

可以someoen澄清这个对我来说最好的实践吗?谢谢

你可以使用其中使用引导文件在所有其他文件,并定义所有的全局参数有,像

# 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是最昂贵的系统调用之一。例如:如果你有这样的include路径 .:/dir1:/dir2:/dir3,你需要一个名为foo.php文件,该文件是在dir3 PHP将提出以下四个stat调用:

./foo.php 
/dir1/foo.php 
/dir2/foo.php 
/dir3/foo.php 

为此需要文件时,你应该总是使用绝对路径并且应该将包含路径限制为一条或两条路径。

或者,如果您使用的是OOP,则始终可以使用autoloading for your classes,这样就不需要文件,而且工作得很好。这种技术的一个很好的例子是Zend Framework autoloader

+0

+1我喜欢这个想法。这真的是每个人都这样做吗? – Mawg

+1

@Mawg我不知道是否每个人都使用这种方法。三年前,我留下了自制代码(通常会导致意大利面条代码),并转移到zend框架和RoR上,因为代码重用和大多数配置方面的约定。我的主要目标之一是避免这类问题。我学到了很多很好的做法,这些做法非常标准,可以在不同的项目中重复使用,并通过讲一种通用语言与其他同事分享。 – Fabio

设置你的include_path在你的php.ini中。这将被搜索的包括。定义你的目录结构,以便包含的文件被覆盖。

在php.ini中设置如下:

include_path=".:/dir/first:/dir/second" 

这意味着,包括和需要的文件中搜索英寸(当前目录,然后/ DIR /第一和最后/ DIR /秒

所以require_once“数据库/的common.php”可以中找到:

/dir/first/database/common.php 
/dir/second/database/common.php 
+0

如果我详尽地列出每个子目录(直到我添加另一个子目录),可能会工作,但似乎没有解决我的问题 - PHP包含文件不知道它从哪里被包括在内,那么如何从一个网站的不同级别中包含有效的相对路径呢? – Mawg