文章来源:
http://www.lupaworld.com/bbs/thread-2898-1-10.html
[绝对原创]PHP中路径问题的解决方案 by longnetpro
引言:
关于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中路径的定义方式。
我这个是以不变应万变的公式化的方案,如果有朋友有更好的方案,欢迎提出讨论!如有不明白的也欢迎提出。
文章来源:
http://www.lupaworld.com/bbs/thread-2898-1-10.html
分享到:
相关推荐
在PHP编程中,`require`和`include`都是用于在脚本中引入其他文件的关键字,它们的作用相似,但略有不同。主要的区别在于处理错误的方式:`require`会在找不到文件时抛出致命错误并停止脚本执行,而`include`只会...
四、解决路径问题的方法 1. 使用`$_SERVER['DOCUMENT_ROOT']`:这个全局变量包含了Web服务器的文档根目录,可以帮助构建绝对路径,避免因不同部署环境造成的路径问题。 2. 配置常量:定义一个名为`BASE_PATH`的常量...
相比之下,`include`在遇到同样问题时,会生成一个警告(Warning)错误,然后继续执行剩余的脚本。这意味着即使文件没有成功包含,程序仍然可以继续运行,只是可能会丢失某些预期的功能。这使得`include`更适合在...
首先,`include`或`require`语句在PHP中用于引入其他PHP文件,这样可以将代码划分为多个独立的文件,每个文件负责特定的功能。这种做法有利于代码的模块化,降低复杂性,并提高代码的可读性和可维护性。 1. **...
现在来说include和require的区别: require()函数包含进来的内容被当成当前文件的一个组成部分,所以当包含进来的文件有语法错误或者文件不存在的时候,那当前文件的PHP脚本都不再执行. include()函数相当于指定这个...
在PHP变成中,include()与require()的功能相同,include(include_once) 与 require(require_once)都是把把包含的文件代码读入到指定位置来,但是二者再用法上有区别:(include()是有条件包含函数,而require()...
这种方法比使用绝对路径更为灵活,可以避免脚本因路径问题而频繁修改。 此外,本文还介绍了PHP CLI模式的一些基本用法和常用的命令行工具。例如,`php --ini`可以显示PHP配置文件的信息,`php --help`则会显示PHP的...
在PHP编程语言中,include和require两个函数都是用于将一个文件包含到当前文件中,并且执行该文件中的代码。尽管它们的用途相同,但这两个函数在处理包含文件失败时的表现有着根本的区别。在实际开发过程中,了解这...
学习Nodejs也是出于对这个新产物的好奇,而且有两个重要项目也需要他的支持,所以要好好学学这个新语种。在nodejs中,模块大概可以分为核心模块和文件模块。核心模块是被编译成二进制代码,引用的时候只需require...
- 在实际操作中,对于复杂的系统权限问题,采用建立父目录的方式来解决文件路径问题是一个有效的解决方案。 ### 总结 在处理“Unable to access ./include/common.inc.php”的问题时,需要关注两个主要方面:确保...
`include_path`是一个PHP配置选项,用于指定在尝试`require`或`include`文件时应检查的路径列表。默认情况下,它包含当前目录(表示为".")和PHP安装的系统include目录(通常表示为"PHPIniDir")。当文件的绝对路径...
相信大家在使用PHP时经常看到include a.php、include_once a.php、require a.php或者require_once a.php类似这样的写法吧? 我们一起来学习和总结一下这几个语句的作用及特点! include 使用方法: include "test...
另外,如果每次执行代码时要读取不同的文件,或有通过一组文件叠代的循环,就应该使用include(),因为可以给想要包括的文件名设置一个变量,当参数为include()时使用这个变量。 php的require()性能与include()虽然...
include() 产生一个警告而require() 则导致一个致命错误。换句话说,如果你想在遇到丢失文件时停止处理页面就用require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。当一个...
标题中的“一个非常详细的require文档”指的是在JavaScript中广泛使用的模块加载库RequireJS的详细教程。RequireJS是一种基于AMD(Asynchronous Module Definition)规范的模块化开发工具,它允许开发者在浏览器环境...