wwwroot //网站根目录 绝对路径为: F:/wwwrootphp
-- folder_a // 文件夹A网站
file_a_a.phpui
file_a_b.phpspa
file_a_c.php继承
-- folder_b // 文件夹Bci
file_b_a.phpio
file_b_b.phptable
file_b_c.phpfunction
-- index.phpclass
*************************************************************
这个目录层次已经很清楚了:
wwwroot为根目录,下面有index.php文件和folder_a,folder_b两个文件夹
这两个文件夹分别有3个php文件
先来看index.php文件的内容:
代码以下 | 复制代码 |
<?php require_once("folder_a/file_a_a.php"); echo "文件folder_a_a.php被包含成功"; ?> |
再来看folder_a/folder_a_a.php文件的内容:
代码以下 | 复制代码 |
<?php require_once("../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?> |
最后再来看看folder_b/folder_b_a.php文件的内容:
代码以下 | 复制代码 |
<?php class X{ function printInfo(){ echo 'success; } } ?> |
ok 若是我如今直接运行 floder_a/file_a_a.php
那么会输出: success
若是我运行 wwwroot下的index.php
那么会报错,缘由是找不到包含文件:file_b_a.php
可是若是我在全部的require_once()中加入 dirname(__FILE__).'/'
那么不管运行 file_a_a.php 仍是 index.php 均可以正常输出
*********************************************************
问题:
我第一次使用的是相对路径,因此重复包含的时候就出错了
而我第二次使用的是绝对路径,因此不出错.但是我仍是有点疑惑:
我先分析了如下使用相对路径会出错的缘由:
我运行index.php,它能找到 folder_a目录,也能找到该目录下的file_a_a.php,因而它就把 folder_a/file_a_a.php 里的内容复制到了index.php 的第一行(包含语句的那行),而后再继续运行(也就是运行包含过来的内容),所以此时等因而在index.php中运行 file_a_a.php 中的require_once('../folder_b/file_b_a.php'); 它根据当前index.php的位置去找这个路径文件(file_b_a.php),固然找不到啦,因此它出错了.
但是我使用绝对路径的时候不是同样的道理吗?可为何它就不出错?可能这句话你们有点不解了,我来详细说明(根据程序的运行顺序来讲明).
程序先运行 index.php(注意此时我加上了 dirname(__FILE__),因此当前是绝对路径),
index.php先运行第一句代码:require_once(dirname(__FILE__).'/'.'folder_a/file_a_a.php');
dirname(__FILE__) 就是 f:/wwwroot/ 因此这句代码包含的路径也就是:
f:/wwwroot/folder_a/file_a_a.php
这个路径是正确的,所以没问题是吧
ok 第一步正确完成
而后它就把 file_a_a.php 中的代码复制到的 index.php 的这个地方:
而后仍然继续运行: 这是也就是在index.php 中运行file_a_a.php 中的全部代码,那么咱们来看看它运行那些代码?
代码以下 | 复制代码 |
<?php require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?> |
对就是这些,须要注意的是,这些代码已经被复制到了index.php,也就是说,如今index.php的内容实际上就变成了:
代码以下 | 复制代码 |
<?php require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); echo "文件folder_a_a.php被包含成功"; ?> |
咱们来看个注意事项
假设有以下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo
代码以下 | 复制代码 |
c.php require_once("a.php"); |
b.php的内容比较有意思,由于它本身要继承 CLASS A 因此本身把a.php也引入进去了
代码以下 | 复制代码 |
require_once("../a.php"); |
执行localhost/c.php 系统报错,报错信息以下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2可是,惊奇的发现,若是去掉b.php里面的require_once语句,执行正常,那么必定是require_once语句定义多了吗?缘由就是Class A重定义了两次?但是不会啊。若是我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那究竟是咋回事呢?
缘由就是,b.php定义的目录和c.php执行文件的目录层级不一致,致使在c.php里面require_once语句有两条。使其至关于
代码以下 | 复制代码 |
require_once("a.php"); |
缘由找到了,由于在c.php里面,其相对目录 “..”就是 c.php的上一层了,致使文件找不到报错。
因此,咱们的结论是,在 PHP 里面,使用require_once的时候,存在不一样层级关系,且有相对目录的使用那么必定要谨慎,当心。
require_once很简单用但在使用时你们尽可能使用绝对路径了。