问题:
在项目开发中,经常需要涉及到 include()函数,其中经常会涉及到嵌套使用include的情况.如何确认include的确切包含路径?下面是针对这个问题的展开.
现在研究根目录的规律问题.
scene:MAC OSX/APACHE/PHP
涉及函数:include
基本:
当前路径: ./
上一级路径: ../
>>>实验一:
寻找include(控制结构)的include_path原理.
A:运行目录与物理目录?
Q:如下实验一,针对b.php来说,
运行目录是/htdoc/
逻辑目录是/htdoc/one/
因为此实验是是运行a.php文件
假设1:include_path=运行目录
假设2:include_path=物理位置目录
假设3:include-path有优先级,先寻找运行目录,再寻找物理目录,[找到马上返回,只返回一个文件].
假设4:include-path有优先级,先寻找物理目录,再寻找运行目录,[找到马上返回,只返回一个文件].
/htdoc/a.php
<?php
header("Content-type:text/html;charset=utf-8;");
include './one/b.php';
?>
>>>
/htdoc/one/b.php
<pre name="code" class="php"><?php
echo '<br />包含./one/b.php成功<br />';
include './one/html.php';
?>
>>>
/htdoc/one/html.php
<?php
echo '<br />包含/htdoc/one/html.php成功<br />';
echo '假设1:include=逻辑运行目录 成立';
?>
>>>
/htdoc/one/one/html.php
<?php
echo '<br />包含/htdoc/one/one/html.php成功<br />';
echo '假设2:include_path=物理位置目录 成立';
?>
>>>实验一结果(运行a.php):
输出
包含./one/b.php成功
包含/htdoc/one/html.php成功
假设1:include=逻辑运行目录 成立
>>>实验二
保留实验一中的
/htdoc/a.php
/htdoc/one/html.php
/htdoc/one/one/html.php
修改:/htdoc/one/b.php
/htdoc/one/b.php
<pre name="code" class="php"><?php
echo '<br />包含one/b.php成功<br />';
include 'one/html.php';
?>
>>>实验二结果(运行a.php):
输出
包含./one/b.php成功
包含/htdoc/one/html.php成功
假设1:include=逻辑运行目录 成立
结论:与实验一输出结果一致.
>>>实验三
保留实验二中的
/htdoc/a.php
/htdoc/one/b.php
/htdoc/one/one/html.php
删除:/htdoc/one/html.php>>>实验二结果(运行a.php):
输出
包含./one/b.php成功
包含/htdoc/one/one/html.php成功
假设2:include_path=物理位置目录 成立
结论:出乎意料,假设2成立.
>>>综合结论:
include被嵌套多层时,include的参数[也就是路径也就是include_path]是有差异的.
A:差异在哪里?
Q:[比较难描述...]举例说明.include_path的值是关键,这个值必定是一个路径.
当最前面为 ./,表示相对当前运行路径来包含文件. //如 include "./one/html.php"; 此时会寻找 /htdoc/one/html.php.
当最前面直接接文件名,include则会查找两个路径(运行路径和物理路径),优先返回运行路径. //如 include "one/html.php"; 此时会寻找/htdoc/one/html.php 和 /htdoc/one/one/html.php. 并且,如果/htdoc/one/html.php存在,则直接返回/htdoc/one/html.php
可以参考PHP手册:
include()
寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。
例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",
则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。
好难表达(描述)include的性质.不管你弄没弄明白,反正我是明白了.