require或include相对路径多层嵌套引发的问题

  require或include相对路径多层嵌套引发的问题
php中require/include 包含相对路径的解决办法
在PHP中require,include一个文件时,大都是用相对路径,是个很头疼的问题。
 
例如:
(网站根目录)
├文件夹
│ │
│ └1.php
├文件夹
│ │
│ └2.php
└index.php
 
问题:在1.php中通过include(“../B/2.php”)来引入B目录下的2.php文件;
在index.php中通过include(“A/1.php”)来引入A目录下的1.php文件;
运行出来当然会出现问题,找不到../B/2.php文件。
 
这是因为:
 
1.php被编译到index.php中执行,也就是相当于1.php同index.php一样位于网站根目录下,但是在1.php别忘记了一段代码include(“../B/2.php”);
“../”意味着什么?上一级目录,现在1.php已经在根目录下了,这时候再上一级,那就已经找不到2.php了,所以问题就出现在此。
 
很多人会想到include(“/B/2.php”),这样不就好了,同样不行php不同于我们的jsp,在include中使用”/”并不是我们所想象的网站根目录,它代表的的
当前的目录,因此还是不行。
 
既然不能用相对的,那我们可以改用绝对路径的方式。只是在包含文件之前,先包含一个global.php
文件。这个文件的内容是:
 
<!--?php
chdir(dirname(__FILE__));
?-->
 
它的作用是将当前目录切换到global.php所在的路径。
将global.php放在根目时录下,在这之后包含的所有文件就会以根目录为基准了。
 
例如,在2.php中引用1.php,则通过2步:
 
1.require(dirname(__FILE__).‘/../global.php’);//视具体的目录情况,反正是要指回到根目录下的global.php
 
2.require(‘A/1.php’)//从根目录开始定位
 
这样的话,不管页面在哪一级目录,我都可以去引用,不用再担心路径问题了!
 
注:chdir()函数的用法
相关函数:getcwd, chroot

头文件:#include <unistd.h>

定义函数:int chdir(const char * path);

函数说明:chdir()用来将当前的工作目录改变成以参数path 所指的目录.

返回值执:行成功则返回0, 失败返回-1, errno 为错误代码.

范例
#include <unistd.h>
main()
{
    chdir("/tmp");
    printf("current working directory: %s\n", getcwd(NULL, NULL));
}

执行:
current working directory :/tmp
新增内容:第二天再次用到这个知识点,但是发现了一个问题,如下
网站根目录
  ----文件0
  ----目录1
  --------文件1
  --------文件2
  ----目录2
  --------文件3
现在目录3中引入了文件0,文件0中有chdir(__FILE__),然后在文件3中按网站绝对路径引入文件2,此时文件2已经处于网站根目录中,文件2要引入文件1,
根据上面的知识,应该也是按照网站根目录绝对路径引入(这种方法当然可以),但是无意中发现在文件2中直接引入文件1也是可行的。自己理解了一下,
原理应该是: 此时的文件2被拉入了根目录,与此同时文件2所在的目录也被变为了根目录,于是文件1也就是 处于根目录中了,所以直接引入和按照网站
根目录绝对路径引入是一样的效果。 这一点总结起来就是一句话:任何情形下,处于同一文件夹(同一级)的文件都可以直接引用!
 
新增: 按上述方法引入后, 下面的html中的路径不受影响(如src href等等,),但是下面的php文件路径受影响,如copy($source,$dest)中的路径等等
php代码  header('refresh:3;url=http://www.baidu.com')中的这个url实质属于html路径,不受上述方法影响。
新增:在单纯的类文件A中用到本文件中没有定义的类B时,不会有任何问题(不需要引入包含B的文件)。只要保证实例化类A的文件中引入B文件即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值