php的include与require区别以及包含路径查找
include和require的区别:
include在文件找不到的时候发出一条警告,代码继续运行。而require则会发出一个致命错误。
引用文件的查找路径:
想把这个问题说清楚,首先需要提一下php对被引用文件路径的分类,一共有以下3类:
<1> 绝对路径,这个没啥说的,linux下以 '/' 开头,windows下以盘符或者 ‘\’ 开头。
<2> 相对路径,以 './' 或者 '../' 开头。
<3> 其他路径,也叫未定义路径,以目录或者文件直接开头的。比如,include("fun.php"), include("common/fun.php")。
另外,php还有个include_path的概念,到时候查找文件可能还会去找这里面的文件。可以在代码中通过get_include_path()查看,和set_include_path()设置。
(1) 当include或者require的路径为绝对路径时,include_path被忽略,文件直接定位到。
(2) 当include或者require的路径为相对路径时,这里就比较坑爹了。很多主流的语言,代码里的相对路径的参考目录是该文件的目录,但是在php中这个参考目录是工作目录。当php的脚本在命令行模式下时,这个参考目录就是CWD,直接pwd输出的目录。如果是在web服务器上执行php页面的话,比如是http://localhost/func.php,那么这个参考目录就是fun.php所在的目录。而且如果fun.php包含了common.php, 而common.php又包含了alarm.php,那么这个参考路径仍然是fun.php所在的路径。
(3) 当include或者require的路径为其他路径时, 先会去include_path下查找(include_path一般为CWD和$PHP_HOME/lib/php), 如果没找到,那么它就会去include代码所在文件的那个目录下去找。假设main.php中是这样的代码, include("fun.php"),那么直接会在main.php所在的目录下查找,找不到就报错,并不会递归去找其下的子目录。 如果是 include("common/fun.php"), 那么就会现在main.php所在目录下找到common目录,然后在common目录下查找fun.php, 同样不会递归查找。