PHP 路径详解 dirname,realpath,__FILE__,getcwd
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\public ( mytest.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 路径详解 dirname,realpath,__FILE__,getcwd
PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息
PHP + Selenium + WebDriver 抓取米扑科技首页
PHP 文件导入 require, require_once, include, include_once 区别
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2020-01-22 05:05:12
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!