background image

PHP 网站开发中关于包含路径问题的解决方案

引言:
关于 PERL 与 PHP 中的包含路径一直是一个比较难解的问题,主要是与操作系统和 WEB
服务器有关,不可能非常智能化的解决这个路径问题。相对于 PERL,PHP 的路径好得多,
解决起来也容易得多,因为 PHP 的相对路径在 PHP 程序中的任何场合都可以使用,而不
象 PERL 在某些语句中必须用绝对路径而导致移植的极其复杂。
基于此,在 PHP 中,我设计了一个绝对稳妥的解决方案,如下所述。
原则:
使用相对路径,但在相对路径中用绝对路径(有点绕,待会儿详解),一是可以保证可
移植性,二是可以方便地修改,三是公式化且结构清晰明了,易于扩展。
步骤详解:
1、先确定好一个程序的根目录,注意是文件系统下的,不是 WEB 服务器下的虚拟目录,
不过一般情况下该目录下的子目录的相对路径与 URL 下该目录的虚拟子目录是相同的。
2、在定义好的程序根目录下的每个子目录下(其实不一定是每个,根据需要)建立一个
settings.php,里面定义一个变量或是常数(常数比较好,因为作用域比较大),如
APPROOT,但这个 APPROOT 却不是绝对路径,而是该目录相对于你指定的程序根目
录的相对路径。
3、在此目录下的所有程序入口文件(也即第一个包含其它文件的文件,或是允许直接在
浏览器中浏览的文件)中第一句写上 require_once('settings.php');,但要注意,所有

——

被包含文件最好不要加此句

其实加上也可以,因为你可以在 settings.php 中写上 

if(!defined(APPROOT)) define(APPROOT, '../..');这类的语句以防重定义。
4 、 如 果 你 要 包 含 其 它 文 件 , 无 论 是 直 接 还 是 间 接 地 包 含 , 都 可 以 写 成 
include(APPROOT.$path);,这里$path 为被包含文件相对于你所指定的程序根目录的
绝对路径。
原理:
定下的程序根目录是相对路径,但具体的目录位置是相对于那个根目录的绝对路径,两
者组合起来就是具体文件相对于程序根目录的相对路径了。例如目录 c:\wwwroot\app 为
你 指 定 的 程 序 根 目 录 , 然 后 有 这 么 两 个 文 件 c:\wwwroot\app\a\index.php 和
c:\wwwroot\app\b\inc.php。对子目录 a 来说,APPROOT 是'..',而对程序根目录来说,
inc.php 的 绝 对 路 径 是 $path='/b/inc.php' , 两 者 组 合 为 '../b/inc.php' 。 如 果 要 在
index.php 中包含 inc.php 就要写成 include('../b/inc.php');,而这个路径不就正好是
刚才组合而成的 APPROOT.$path 吗?
结论:
经过以上处理,各个路径绝对整齐划一,唯一罗嗦一点的就是每个目录下要定义一下这
个 APPROOT,但每个目录下只需在本目录的 settings.php 中定义一次就足够了。如果
你整个程序只有一个入口文件,如 index.php,而其它文件全部都是直接或是间接地被
包含进这个唯一的入口文件的话,就只需在 index.php 的所在目录下的 settings.php
中定义一次就 OK 了。如果有朋友做过 Delphi 的工程并对工程文件研究过的话,就会发
现我刚才说的一个程序只有一个主入口文件的情况与 Delphi 的工程十分相似,因为
Delphi 除了一个主程序文件(dpr 文件),其余的全部是单元文件或是资源文件,都不能
独立执行。在 PHP 中,如果这种情况出现,只需定义一次 APPROOT,并在主程序文件
中 第 一 句 话 写 成 require_once('settings.php'); , 而 以 后 所 有 的 包 含 全 都 可 以 用
include(APPROOT.$path);

,就保证不会有任何问题,除非你不会写这个 包含文件相