php文件包含路径问题


编	写:袁	亮
时	间:2015-12-01
说	明:php文件包含路径问题

一、解决什么问题
	1、在某些项目代码中,会出现包含出错问题
	2、多次include的时候,会发现不知道包含的到底是哪个文件
	3、某些项目代码中,找不到对应include进来的文件

二、前置知识:3种路径
	1、绝对路径
		linux下,以/开头的路径
		window下以盘符开头的,比如c:/
	2、相对路径
		以.或者..开头的路径
	3、不确定路径
		非上述两种情况的都是

三、包含路径include_path
	1、这是一个目录列表
	2、在php查找文件的时候起作用,主要是以下这些函数
		include,require,fopen,file,readfile,file_get_contents
	3、查找文件的时候,会根据include_path中的目录列表一个个去找,找到之后中止返回
	4、功能类似系统中的环境变量
	5、可以通过php.ini或者php代码中进行设置(也可以通过php函数读取)
	6、默认值是. 代表当前工作目录(简单来说就是访问的第一个php文件所在的目录)

四、查找要包含哪个文件
	1、包含的是绝对路径的文件
		与include_path无关,直接引用绝对路径所对应的文件
	2、包含的是相对路径的文件
		跳过include_path,根据工作路径拼接上相对路径,查找文件,如果有则包含,没有则报错
		ps:工作路径即访问的第一个php文件所在的目录
	3、包含的是不确定路径的文件
		3.1 逐个使用include_path中的目录跟不确定路径拼接查找文件,找到则退出
		3.2 如果没有找到,则根据包含语句include所在的文件的目录,拼接上不确定路径查找文件
		3.3 如果还是没有,则报错

五、解决方案
	1、项目的一个公共文件,通过__FILE__,或者__DIR__(php 5.3后),结合dirname来计算获取项目根目录
	2、所有文件包含,均通过项目根目录进行拼接,得到绝对路径,再包含
	3、使用不确定路径包含文件
		3.1 使用不确定路径,包含当前目录或当前目录的子目录下的文件
		3.2 这种方法性能较差,因为必然是经过多次查找才能得到
		3.3 而且在项目工作目录出现同名文件,则会出现包含到错误文件的情况
		3.4 常见于sdk包,一般情况下少用

参考文档:
1、PHP中require和include路径问题详解
	http://www.cnblogs.com/rainman/p/4177302.html
2、PHP手册
	http://php.net/manual/zh/ini.core.php#ini.include-path
	http://php.net/manual/zh/function.set-include-path.php