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 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
php类中private属性继承问题分析
Nov 01 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
详解php协程知识点
Sep 21 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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遍历删除整个目录及文件的方法
2015/03/13 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
酒店总经理岗位职责
2015/04/01 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
教你部署vue项目到docker
2022/04/05 Vue.js