目录
PHP 相对路径与绝对路径的区别
问题描述
首先我们先来看一下我们这个例子的目录结构以及这三个文件的内容
a.php
<?php
include './c/d.php'
b.php
<?php
define('__B', 'this is a test');
c/d.php
<?php
include '../b.php';
var_dump(__B);
在c目录下面的d.php文件,引用了它的上级目录下的 b.php 文件,单独运行 c/d.php 的时候不会出问题,
但是,如果在和b同级目录下的a.php引用c/d.php的话,就会出问题了。
它会报错说文件不存在
思考
大概意思就是 a.php 把 c/d.php 引入到 a.php 中后, include '../b.php'
这个路径就是相对于 a.php 来说的了,然后对于 a.php 来说的这个相对路径它是不存在的,所以就出现了这个问题
如果一个文件可能在多个地方被引用的时候使用相对路径就相当容易出问题,然后我们使用绝对路径能够轻松解决这个问题。
使用绝对路径解决问题
如果我们把文件改成如下内容
a.php
<?php
include __DIR__.'/../b.php';
var_dump(__B);
b.php
<?php
define('__B', 'this is a test');
c/d.php
<?php
include __DIR__.'/../b.php';
var_dump(__B);
这样就改成了对文件的绝对路径进行引用了, __DIR__
是php5.3开始中就有的预定义的魔术常量,表示这个文件所在的目录,然后我们利用这个来可以写出绝对路径,在运行a.php和c/d.php的时候都能够正常执行了,如果在php5.3之前都是使用 dirname(__FILE__)
来替代 __DIR___。
总结
以上就是关于php中相对路径的问题以及绝对路径的使用的全部内容,希望对大家使用PHP能有所帮助,避免再进入php中相对路径的坑。
补充
在有的web服务器不同的配置中,相对路径也容易出现错误,强烈建议使用绝对路径的形式来include文件。如:
<?php
include(__DIR__.'\..\..\config\site_info.php'); //不建议这种书写方法
include(__DIR__.'\..\..\config\site_info.php'); //windows和linux通用
php目录分隔符DIRECTORY_SEPARATOR
在windows我们习惯性的使用“\”作为文件分隔符,但是在linux上系统不认识这个标识,于是就要引入这个php内置变量了:DIRECTORY_SEPARATOR
路径分隔符 | |
windows | \ or / |
linux | / |
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符,在linux上路径的分隔符是/,这就导致了一个问题,比如开发机器是windows,有一个图片上传程序,,而我们又使用了(\)作为文件分隔符,调试机器上指定的上传文件保存目录是:
define('ROOT',dirname(__FILE__)."\upload"),
在本地调试都很正常,但是上传到linux服务器的时候会发现会出错。
这个问题就是出在文件的分隔符上,windows上习惯性的使用\作为文件分隔符,但是在linux上人家是不认识这个标识的,人家只认识/,于是就要引入下面这个php内置变量了:DIRECTORY_SEPARATOR。
上面的写法可以改写为以下无错写法:
define('ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR."upload");
这样就可以确保不会出错了。
例如discuz里面是这样写的:
define('S_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR);
回到问题本身上,DIRECTORY_SEPARATOR 是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到。
<?php
include('smarty/Smarty.class.php');
//程序目录
const DIR_SEP = DIRECTORY_SEPARATOR;
define('SITE_ROOT', dirname(__FILE__).DIR_SEP);
$smarty = new Smarty;
$smarty->template_dir = SITE_ROOT.'templates'.DIR_SEP;
$smarty->complie_dir = SITE_ROOT.'templates_c'.DIR_SEP;
$smarty->config_dir = SITE_ROOT.'configs'.DIR_SEP;
$smarty->cache_dir = SITE_ROOT.'cache'.DIR_SEP;
$smarty->assign('world','hello world!');
$smarty->display('index.htm');