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 相关文章推荐
PHP中,文件上传
Dec 06 PHP
DISCUZ 论坛管理员密码忘记的解决方法
May 14 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 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
PHP中str_replace函数使用小结
2008/10/11 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
多广告投放代码 推荐
2006/11/13 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python返回昨天日期的方法
2015/05/13 Python
儿童编程python入门
2018/05/08 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
青年创业培训欢迎词
2014/01/08 职场文书
公司会计岗位职责
2014/02/13 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
谢师宴家长致辞
2015/07/27 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
基于python实现银行管理系统
2021/04/20 Python
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python