PHP 路径详解 dirname,realpath,__FILE__

​比如:程序根目录在:E:\wamp\www 中

 

1.    __FILE__   获取当前文件的绝对路径(目录 + 文件名及其后缀

如果在index.php中调用,则返回  E:\wamp\www\index.php

下面再看一下,程序根目录的目录结构

 

如果在 c_system_base.php中调用__FILE__ 则返回:E:\wamp\www\zb_system\function\c_system_base.php

 

2、dirname(__FILE__)  返回当前目录的上级目录,或当前文件所在的目录 (结尾不带/)

dirname() 一般跟__FILE__联合使用,其参数可以是文件(返回文件的目录),也可以是目录(返回上一级目录)

如果在 c_system_base.php中调用dirname(__FILE__) 则返回 

E:\wamp\www\zb_system\function    (文说件返回所在目录)

如果调用 dirname(dirname(__FILE__)) 参数先文件后目录都调用了,则返回  

E:\wamp\www\zb_system        (目录返回上级目录)

 

3、realpath() 返回当前文件的绝对路径 或 相对根目录的路径

如果在 c_system_base.php中调用realpath(__FILE__) 则返回

E:\wamp\www\zb_system\function\c_system_base.php

其它参数返回值(仍然在 E:\wamp\www\zb_system\function\c_system_base.php 中执行 ):

realpath('/')    返回磁盘根目录    E:\ (windows)或 / (linux)

realpath('./')    返回当前所在的目录  E:\wamp\www\zb_system\function

realpath('../')    返回相对程序根目录的上级目录,即程序根目录的目录 E:\wamp\www\zb_system

 

realpath() 也可以和dirname() 配合使用 一般还会加上几个相对路径../ (前面要加/  即:/../)

realpath(dirname(__FILE__))    返回  E:\wamp\www\zb_system\function

realpath(dirname(__FILE__).'/../')  返回 E:\wamp\www\zb_system

realpath(dirname(__FILE__).'/../../')    返回    E:\wamp\www

 

示例代码:

vim /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy/index.php

<?php
require_once(dirname(__FILE__) . "/../doc_header.php");
echo "<script>document.title = '隧道代理 - 产品文档 - 文档中心 - 米扑代理' </script>";

echo "<br> buy/index.php  __FILE__ : " . __FILE__;
echo "<br> buy/index.php  __DIR__ : " . __DIR__;
echo "<br> buy/index.php  dirname(__FILE__) : " . dirname(__FILE__);
echo "<br> buy/index.php  dirname(dirname(__FILE__)) : " . dirname(dirname(__FILE__));
echo "<br> buy/index.php  getcwd() : " . getcwd();
echo "<br> buy/index.php  realpath('/') : " . realpath('/');
echo "<br> buy/index.php  realpath(__FILE__) : " . realpath(__FILE__);
echo "<br> buy/index.php  realpath(realpath(__FILE__)) : " . realpath(realpath(__FILE__));
echo "<br> buy/index.php  realpath('./') : " . realpath('./');
echo "<br> buy/index.php  realpath('../') : " . realpath('../');
echo "<br> buy/index.php  realpath('../../') : " . realpath('../../');
echo "<br> buy/index.php  realpath('../../../') : " . realpath('../../../');
echo "<br> buy/index.php  realpath('../../../../') : " . realpath('../../../../');
echo "<br> buy/index.php  realpath('../../../../../') : " . realpath('../../../../../');

echo "<br> buy/index.php  basename(__FILE__) : " . basename(__FILE__);
echo "<br> buy/index.php  basename(basename(__FILE__)) : " . basename(basename(__FILE__));
echo "<br> buy/index.php  filesize(__FILE__) : " . filesize(__FILE__);
echo "<br> buy/index.php  file_exists(__FILE__) : " . file_exists(__FILE__);
echo "<br> buy/index.php  file_exists(dirname(__FILE__)) : " . file_exists(dirname(__FILE__));

echo "<br> buy/index.php  json_encode(pathinfo(__FILE__)) : " . json_encode(pathinfo(__FILE__));
echo "<br> buy/index.php  var_dump(pathinfo(__FILE__)) : ";
var_dump(pathinfo(__FILE__))
?>

运行结果:

注:在 index.php 当前目录下运行,会影响 getcwd() 工作目录即当前目录

buy/index.php __FILE__ : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy/index.php
buy/index.php __DIR__ : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy
buy/index.php dirname(__FILE__) : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy
buy/index.php dirname(dirname(__FILE__)) : /Users/homer/Downloads/myCode/workspace/proxy_client/doc
buy/index.php getcwd() : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy
buy/index.php realpath('/') : /
buy/index.php realpath(__FILE__) : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy/index.php
buy/index.php realpath(realpath(__FILE__)) : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy/index.php
buy/index.php realpath('./') : /Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy
buy/index.php realpath('../') : /Users/homer/Downloads/myCode/workspace/proxy_client/doc
buy/index.php realpath('../../') : /Users/homer/Downloads/myCode/workspace/proxy_client
buy/index.php realpath('../../../') : /Users/homer/Downloads/myCode/workspace
buy/index.php realpath('../../../../') : /Users/homer/Downloads/myCode
buy/index.php realpath('../../../../../') : /Users/homer/Downloads
 
buy/index.php basename(__FILE__) : index.php
buy/index.php basename(basename(__FILE__)) : index.php
buy/index.php filesize(__FILE__) : 4190
buy/index.php file_exists(__FILE__) : 1
buy/index.php file_exists(dirname(__FILE__)) : 1
 
buy/index.php json_encode(pathinfo(__FILE__)) : {"dirname":"\/Users\/homer\/Downloads\/myCode\/workspace\/proxy_client\/doc\/buy","basename":"index.php","extension":"php","filename":"index"}
buy/index.php var_dump(pathinfo(__FILE__)) :
/Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy/index.php:33:
array (size=4)
  'dirname' => string '/Users/homer/Downloads/myCode/workspace/proxy_client/doc/buy' (length=60)
  'basename' => string 'index.php' (length=9)
  'extension' => string 'php' (length=3)
  'filename' => string 'index' (length=5)

 

 

PHP  常用获取文件目录的方式

getcwd() :显示是在哪个文件(显示其目录,即工作目录)里调用此文件的目录(即当前工作目录的路径),可用来获取框架入口文件所在目录。

__DIR__ :当前内容写在哪个文件就显示这个文件目录,即写着 __DIR__ 文件的目录。

__FILE__ : 当前内容写在哪个文件就显示这个文件目录+文件名,可使用dirname(__FILE__)获取当前文件目录名。

文字介绍了一遍,还是一脸懵逼,没搞懂,那么就举例:

上图,目录关系与运行结果

1)最后运行的见上图底部: wtm_admin.dev/mytest.php,即工作文件

2)被引用文件,就是当前文件,写入了着:getcwd()  和 __DIR__

执行完毕 mytest.php 工作文件后:

1)getcwd()   获取了 mytest.php 工作文件的工作目录,即 xxx\wtm_admin\publicmytest.php 工作文件在 public/ 目录下)

2)__DIR__ 当前内容写在哪个文件就显示这个文件目录,test.php 文件写着这个,就显示 test.php 文件的目录 xxx\wtm_admin\public\kkk

3)__FILE__ 当前内容写在哪个文件就显示这个文件目录+文件名,即显示 test.php 文件的目录 xxx\wtm_admin\public\kkk\test.php

所以,getcwd() 得到的是引入文件(工作文件)的工作路径(目录),但__DIR__得到的是当前文件的实际路径(目录)

 

 

dirname(__FILE__)和__DIR__ 比较

PHP 获取当前脚本(文件)所在目录的绝对路径,dirname(__FILE__) 和 __DIR__都可以实现

那么什么情况下用 dirname(__FILE__),什么情况下用 __DIR__ 呢?它们之间有什么区别?

1、功能和效率

dirname(__FILE__)由两部分组成, __FILE__ 魔术变量和 dirname() 函数

__FILE__是当前脚本的绝对路径,通过 dirname() 函数后,就可以获得脚本所在目录的绝对路径。

举个栗子,有个 hello.php 文件,其部署在服务器的目录是:/home/www/website/hello.php

那么,

__FILE__ 的值就是:/home/www/website/hello.php

dirname(__FILE__) 返回就是:/home/www/website/

如果我们在 hello.php 用 __DIR__全局变量,就可以直接获得所在目录的绝对路径:/home/www/website/,和 dirname(__FILE__) 效果完全一样。

在实现同样功能的情况下,dirname(__FILE__)多了一层函数调用。

结论: __DIR__ 比 dirname(__FILE__) 在效率上有优势,推荐使用 __DIR__

 

2、PHP版本支持

__FILE__ 和 dirname() 函数从 PHP 4.0.2 就开始启用。

__DIR__ 变量则是 PHP 5.3.0 新增的。(比较新,需考虑版本,目前php都支持了吧)

所以,如果你的PHP版本大于等于PHP 5.3.0,建议使用 __DIR__。

否则,最好还是用 dirname(__FILE__),以确保程序不会出错。

 

 

参考推荐:

PHP 文件操作常用函数

PHP 常用函数总结(数组,字符串,时间,文件操作)

PHP 路径详解 dirname,realpath,__FILE__,getcwd

PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息

PHP 下载保存文件到本地

PHP下载远程图片

PHP抓取网站ico图标

PHP + Selenium + WebDriver 抓取米扑科技首页

PHP 文件导入 require, require_once, include, include_once 区别