入门 - include_path

  • 作者:KK

  • 发表日期:2016.8.17


要点速读

  1. include_path配置项控制了include|require语句要去哪里找引入的文件

  2. 在include_path找不到指定文件时会在当前目录开始找文件

  3. include_path配置可以设置多个目录,一个找不到再找下一个目录

  4. 由于各系统的目录分隔符不一样,设置多目录的时候注意用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:\libD:\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下又自动变成了;