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 相关文章推荐
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
处理单名多值表单的详解
Jun 08 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
php文件上传的两种实现方法
Apr 04 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
Redis构建分布式锁
Mar 28 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
中标通知书
2015/04/17 职场文书
初中化学教学反思
2016/02/22 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
新手初学Java网络编程
2021/07/07 Java/Android
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫