PHP中路径问题的解决方案


Posted in PHP onOctober 09, 2006

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);,就保证不会有任何问题,除非你不会写这个“包含文件相对于程序根目录的绝对路径”$path。

这个方法我用了不止一次,收效很好。另外还可以参考JSP的WEB-INFO中路径的定义方式。

我这个是以不变应万变的公式化的方案,如果有朋友有更好的方案,欢迎提出讨论!如有不明白的也欢迎提出。

PHP 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
无数据库的详细域名查询程序PHP版(1)
Oct 09 PHP
说明的比较细的php 正则学习实例
Jul 30 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 PHP
Laravel配合jwt使用的方法实例
Oct 25 PHP
新浪新闻小偷
Oct 09 #PHP
如何使用PHP获取网络上文件
Oct 09 #PHP
用PHP动态创建Flash动画
Oct 09 #PHP
一个odbc连mssql分页的类
Oct 09 #PHP
拼音码表的生成
Oct 09 #PHP
用PHP和MySQL保存和输出图片
Oct 09 #PHP
PHP生成带有雪花背景的验证码
Oct 09 #PHP
You might like
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
一个简易需要注册的留言版程序
2006/10/09 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
python计算方程式根的方法
2015/05/07 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Python实现结构体代码实例
2020/02/10 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
大学旷课检讨书
2014/01/28 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
民政局个人整改措施
2014/09/24 职场文书
优秀班组事迹材料
2014/12/24 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
创建文明城市倡议书
2015/04/28 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书