1

官网关于include加载路径解释如下:

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。

include_path

这是一个需要在php.ini中设置的值,一般情况下我们不会轻易设置它

脚本文件所在的目录

顾名思义就是当前php文件所在的目录的路径

当前工作目录

这个值是容易混淆的,因为这个所谓的当前工作目录路径其实和文件是否被include有关系!这一点在框架中更容易被混淆、被忽略!

实例说明

文件目录结构如下:

- require
-- app
--- application.php
--- db.php
-- index.php
-- db2.php

index.php中的代码

<?php
/*只是包含了app目录下的application.php文件*/
include "app/application.php";

application.php

<?php
/*这里包含的db.php文件和application.php文件同一个目录*/
$config = include "db.php";
print_r($config);
/*这里包含的db2.php文件和index.php文件同目录*/
$config2 = include "db2.php";
print_r($config2);
echo "\n";
echo "\n__FILE__:";
print_r(__FILE__);
echo "\n__DIR__:";
print_r(__DIR__);
echo "\nWorking Dir:";
print_r(getcwd());

你猜运行index.php后的显示的打印结果是什么?

你是不是认为 $config2 = include "db2.php"; 会报错?

然而结果是这样的

Array
(
    [host] => 127.0.0.1
    [username] => root
    [password] => root
)
Array
(
    [host] => 127.0.0.1
    [username] => root2
    [password] => root2
)


__FILE__:E:\dongchao\projects\test\php\require\app\application.php
__DIR__:E:\dongchao\projects\test\php\require\app
Working Dir:E:\dongchao\projects\test\php\require

正如官网所述,include会尝试在当前脚本所在目录和当前工作目录查找文件是否存在。db.php所在的目录正是当前脚本所在目录,而当前工作目录则是index.php所在的目录,如果把这个看成是一个框架的目录结构,那么当前工作目录其实就是框架入口文件所在的目录。

getcwd函数可以获取到当前工作目录路径

得出结论:

为了不引起混淆,提高代码可读性,建议引入文件时使用绝对路径! 使用绝对路径还可以避免include函数多余的两次查找(从当前脚本所在目录和当前工作目录进行查找),因此使用绝对路径能提高执行效率!


Charles
410 声望25 粉丝

14年入行,后端开发