目錄
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');