入门 - include_path ¶
作者:KK
发表日期:2016.8.17
要点速读 ¶
include_path配置项控制了include|require语句要去哪里找引入的文件
在include_path找不到指定文件时会在当前目录开始找文件
include_path配置可以设置多个目录,一个找不到再找下一个目录
由于各系统的目录分隔符不一样,设置多目录的时候注意用
PATH_SEPARATOR
这个常量来做间隔符
这是配置的一个选项,用来控制include和require的时候去哪里找文件
很多不用的配置其实默认都被 ; 号屏蔽的 ¶
咱们在配置文件中搜索include_path
内容大概如下:
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
; http://php.net/include-path
上面有两个;include_path = ....
其实都是在前面用了;符号进行了注释屏蔽的,所以都不会生效,我们要用的时候只要删除其中一个的;号就可以了
而且它之所以有2个是因为PHP通常会被开发者放在Windows或Linux系统上运行,所以官方默认的配置文件就附带了两个系统的配置说明,你看配置项上面还有一个注释说UNIX什么什么,Windows什么什么,就是说这两个系统里你要如何配置这些格式了
而再下面那堆话并带一个网址的内容呢,你访问这个网址就能得到更加详细的官方解释,这里只是简单地告诉你这个配置的东西
玩玩include_path ¶
解除Windows说明下的include_path配置吧,将它改成这样:
include_path = "D:\lib"
重启一下服务器,然后在D盘下建一个lib目录,写一个b.php内容如下:
echo 'here b.php';
再在网站目录下include('b.php')
,我猜你的网站目录不会在D:\lib吧?应该可能在D:\phpStudy\WWW
之类的文件夹是吧,好,运行起来
那你就发现会输出"here b.php"这个内容了
因为include的时候,会根据include_path所配置的目录去找文件
此时你试下将D:\lib\b.php移动到D:\phpStudy\WWW目录下再运行就会报错说找不到文件
因为include_path配置里并没有记下你的当前目录,所以PHP不在你的当前目录找文件,只要将配置改成这样就好了:
include_path = ".;D:\lib"
就是在前面加了个.;
,下面的内容会讲解这个,记得重启服务器才能生效哦
设置多个include_path ¶
将配置改成
include_path = ".;D:\lib;D:\qqq"
就是用;号隔开多个目录就行了,这样文件放其中任何一个目录都能被include到,用;号隔开那其实就是.
、D:\lib
和D:\qqq
,其中.
就是PHP程序的当前工作目录
PHP会从右到左按顺序查找要引入的文件,所以如果三个目录都存在相同名字的文件,那么“D:\qqq”下的文件会被引入,另外两个目录的不会被引入
发现个BUG,我也不清楚具体原因 ¶
如果多个include_path目录都存在相同文件如b.php,运行一次代码
include('b.php')
成功包含最右边那个D:\qqq\b.php的话,再删除D:\qqq\b.php然后再运行,这会导致无法引入D:\lib\b.php,反而是报错说找不到文件(可是文件明明是存在的),当重启服务器后再运行才能找到
用set_include_path函数修改配置 ¶
其实PHP的大部分配置是可以在运行的过程中动态修改的:
echo get_include_path();
set_include_path('.' . PATH_SEPARATOR . 'D:\a' . PATH_SEPARATOR . 'D:\b' . PATH_SEPARATOR . 'D:\c');
//set_include_path('.;D:\a;D:\b;D:\c'); //效果和这个差不多,但不要这样写,要像上面那样使用 PATH_SEPARATOR 来连接各个目录
但程序运行结束后,include_path的值又会恢复到配置文件的值,用函数修改的只是在本次运行程序时生效而已,不是永久修改生效哦
注意别踩坑 ¶
然后上面的代码注释中提到要使用
PATH_SEPARATOR
来连接各个目录,原因是如果你写死了目录1;目录2;目录N
这样用;
号来分隔各个目录的话,在Windows系统下可以被识别没错,可是在Unix或Linux系统下就无法被识别了,这两个系统是这么识别目录分隔的:目录1:目录2:目录N
所以为了让你的代码能方便地运行在两种不同的系统上,用 PATH_SEPARATOR 这个常量是正确的,这个常量在Linux系统下的值会是
:
,而在Windows下又自动变成了;