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文件即可。

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

  1. PHP中require和include路径问题总结

    1 绝对路径.相对路径和未确定路径 相对路径 相对路径指以.开头的路径,例如 ./a/a.php (相对当前目录) ../common.inc.php (相对上级目录), 绝对路径 绝对路径是以 / ...

  2. 【转】PHP中require和include路径问题总结

    1 绝对路径.相对路径和未确定路径 2. 相对路径: 3. 绝对路径 4. 未确定路径 5. 解决方案 1 绝对路径.相对路径和未确定路径 相对路径 相对路径指以.开头的路径,例如 ./a/a.php ...

  3. angularjs ui-view多视口多层嵌套路由配置

    最近研究了一下ui-view多层嵌套,整理了一下 1.最简单的ui-view用法 html部分: <ul class="nav navbar-nav"> <li ...

  4. 2019-07-24 require 和 include的区别

    require 和 include 都是文件引入的常用用法.那他们有什么区别吗? 首先我们创建一个需要引入的文件叫做test.php,里面写上简单的一行代码: echo "我是要被引入的文件 ...

  5. 使用jsonpath解析多层嵌套的json响应信息

    Python自带的json库可以把请求转为字典格式, 但在多层嵌套的字典中取值往往要进行多次循环遍历才能取到相应的数据, 如: res_dict = { "code": 0, &q ...

  6. 修改if-else多层嵌套的方法

    例子:在判断三角形形状的一个程序中,会出现 if-else 的多层嵌套,可利用程序的顺序执行结构重构代码,使其更可读.如果还想保证代码的安全性,可以用函数封装这段代码. #include <st ...

  7. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

  8. 元素多层嵌套,JS获取问题

    如果一段html嵌套过多,在js中获取还是比较麻烦的,我写了几套方案,大家可以参考参考,如果你有好的方法,也分享出来,让我们瞧瞧. HTML: <!DOCTYPE html> <ht ...

  9. .net(c#)提取多层嵌套的JSON

    Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提 ...

随机推荐

  1. 《zw版·Halcon-delphi系列原创教程》 2d照片-3d逆向建模脚本

    <zw版·Halcon-delphi系列原创教程> 2d照片-3d逆向建模脚本 3D逆向建模,是逆向工程的核心要素.       3D逆向建模,除了目前通用的3D点云模式,通过2D图像实现 ...

  2. yii2购物车实现

    1.商品列表中点击加入购物车,则跳转到购物车列表,效果如图所示: 视图代码goods/list.php中.代码如下: <?php echo Html::a('加入购物车',['cart','id ...

  3. where 子句和having子句中的区别

    1.where 不能放在GROUP BY 后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数 ...

  4. java IO复习笔记

    1. IO是什么? Input Output Java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流, ...

  5. nginx 反向代理 和lvs负载均衡

    nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...

  6. 161206、 Ionic、Angularjs、Cordova搭建Android开发环境

    1.jdk 环境变量配置 path:C:\Program Files\Java\jdk1.7.0_79\bin 2.Node.js 因为安装cordova时要用到node.js的npm 下载地址: h ...

  7. 前端开发自动化工作流工具,JavaScript自动化构建工具grunt、gulp、webpack介绍

    前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...

  8. VPS常用工具

    1.命令行工具 putty 在Mac下,可以直接使用超级终端 ssh username@ipaddress 2.可视化上传文件工具 WinSCP 在Mac下,使用 Cyberduck

  9. drupal 自定义表单调用autocomplete主标签实现方法

    代码如下: <php function module_name_form() { $form = array(); $form['city'] = array( '#title' => t ...

  10. JavaEE基础(十)

    1.面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改, ...