易截截图软件、单文件、免安装、纯绿色、仅160KB

[转]深入理解PHP之require/include顺序


作者: laruence(http://www.laruence.com
)
本文地址: http://www.laruence.com/2010/05/04/1450.html
转载请注明出处
在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计,
这个不影响本文的探讨), 但是正是因为include_path, 经常会让我们遇到一些因为没有找到正确的文件而导致的看似”诡异”的问题.
也就有了如下的疑问:
include_path是怎么起作用的?
如果有多个include_path顺序是怎么样的?
什么情况下include_path不起作用?
今天, 我就全面的介绍下这个问题, 先从一个例子开始吧.
如下的目录结构:
root
├ 1.php
├ 3.php
└ subdir
├ 2.php
└ 3.php
在1.php中:
<?php
ini_set
(
"include_path"
,
".:path_to_subdir"
);
require
(
"2.php"
);
?>
而在2.php中:
<?php
require
(
"3.php"
);
?>
而在root目录下的3.php打印出”root”, 在subdir目录下的3.php打印出”subdir”;
现在, 我的问题来了:
1. 当在root目录下运行1.php, 会得到什么输出?
2. 在subdir下运行上一级目录的1.php, 有会得到什么输出?
3. 当取消include_path中的当前目录path(也就是include_path=”path_to_subdir”), 上面俩个问题又会是什么输出?
PHP中的include_path
PHP在遇到require(_once)/include(_once)的指令的时候, 首先会做如下的判断:
要包含的文件路径是绝对路径么?
 如果是, 则直接包含, 并结束.
 如果不是, 进入另外的逻辑(经过多次调用, 宏展开后进入_php_stream_fopen_with_path)寻找此文件
接下来, 在_php_stream_fopen_with_path中, 会做如下判断:
要包含的文件路径是相对路径么(形如./file, ../dir/file, 以下用"目录相对路径代替")?
 如果是, 则跳过include_path的作用逻辑, 直接解析相对路径(随后单独介绍).
会根据include_path,和当前执行文件的path组成一个待选的目录列表, 比如对于文章前面的例子来说, 会形成一个如下的待选列表
".:path_to_subdir:current_script_dir"
然后, 依次从待选列表头部开始, 根据DEFAULT_DIR_SEPARATOR(本文的环境是”:”)取出待选列表中的一个路径, 然后把要包含的文件名附加在这个路径后面, 进行尝试. 如果成功包含, 则返回, 否则继续下


相关文档:

php的simpletest框架对uchome项目进行接口测试脚本

<?php
require_once ('unit_tester.php');
require_once ('reporter.php');
require_once ('../config.php');
require_once ('../source\modules\user\user_api.func.php');
require_once ('../source/base_model.class.php');
Class registertest extends UnitTestCase{
public function testAssertEqual(){
$b ......

小巧的php文档生成类

在项目开发中发现对php的文档缺少管理,别人写了一个,功能不多
<?php
/**
* 类名: doc
*
描述: 文档生成类
* 其他: 可以对目录进行过滤,设置好源目录后,请用绝对路径指定生成目录,模式可调,模式
*
1为常规类型,即以 斜线**开头,以*斜线 结束
* 2为扩展类型,凡是 斜线*开头以*斜线 结束的部分都将成为文 ......

PHP统计网站访问次数防刷新

<?
@session_start();
$counter = intval(file_get_contents("counter.dat"));
if(!$_SESSION['jingyun'])
{
$_SESSION['jingyun'] = true;
$counter++;
$fp = fopen("counter.dat","w");
fwrite($fp, $counter);
fclose($fp);
}
?>
总访问 <span style="font-size:14px; color:#FF6600" mce_sty ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号