官网关于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函数多余的两次查找(从当前脚本所在目录和当前工作目录进行查找),因此使用绝对路径能提高执行效率!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。