【问题标题】:Difference Between getcwd() and dirname(__FILE__) ? Which should I use?getcwd() 和 dirname(__FILE__) 之间的区别?我应该使用哪个?
【发布时间】:2011-01-12 04:35:39
【问题描述】:

在PHP中有什么区别

getcwd()
dirname(__FILE__)

当我从 CLI 回显时,它们都返回相同的结果

echo getcwd()."\n";
echo dirname(__FILE__)."\n";

返回:

/home/user/Desktop/testing/
/home/user/Desktop/testing/

哪个是最好用的?有关系吗?更高级的 PHP 开发人员更喜欢什么?

【问题讨论】:

  • 别忘了dirname(__FILE__)__DIR__一样

标签: directory php


【解决方案1】:

__FILE__ 是一个magic constant,包含您正在执行的文件的完整路径。如果你在一个包含中,它的路径将是__FILE__ 的内容。

所以有了这个设置:

/folder/random/foo.php

<?php
echo getcwd() . "\n";
echo dirname(__FILE__) . "\n" ;
echo "-------\n";
include 'bar/bar.php';

/folder/random/bar/bar.php

<?php
echo getcwd() . "\n";
echo dirname(__FILE__) . "\n";

你得到这个输出:

/folder/random
/folder/random
-------
/folder/random
/folder/random/bar

所以getcwd() 返回你开始执行的目录,而dirname(__FILE__) 是文件相关的。

在我的网络服务器上,getcwd() 返回最初开始执行的文件的位置。使用 CLI,它与执行 pwd 时得到的结果相同。 documentation of the CLI SAPIgetcwd 手册页上的评论支持这一点:

CLI SAPI 确实 - 与其他 SAPI 不同 - 不会自动将当前工作目录更改为启动脚本所在的目录。

比如:

thom@griffin /home/thom $ echo "<?php echo getcwd() . '\n' ?>" >> test.php
thom@griffin /home/thom $ php test.php 
/home/thom
thom@griffin /home/thom $ cd ..
thom@griffin /home $ php thom/test.php 
/home

当然,另请参阅http://php.net/manual/en/function.getcwd.php 的手册

更新:从 PHP 5.3.0 开始,您还可以使用魔术常量 __DIR__,它等同于 dirname(__FILE__)

【讨论】:

  • 完美的例子就是完美的!谢谢!
  • 有没有快速的方法从包含的脚本中获取主脚本的目录。所以在一个包含在不同目录中的脚本中,我想知道包含它的主脚本的目录。
  • @CMCDragonkai:不知道有没有更好的办法,不过你可以试试在主文件中设置一个常量为__DIR__的值。
  • @ThomWiggers,似乎__DIR__ 的性能更高,对吧?
  • 我不知道它们在内部是如何工作的,所以我不知道。不过我怀疑这很重要,您可能应该根据功能做出选择。
【解决方案2】:

如果从命令行调用文件,区别就很明显了。

cd foo
php bin/test.php

在 test.php 中,getcwd() 将返回 foo(您当前的工作目录),dirname(__FILE__) 将返回 bin(正在执行的文件的目录名)。

【讨论】:

    【解决方案3】:

    试试这个。

    将你的文件移动到另一个目录,比如testing2

    这应该是结果。

    /home/user/Desktop/testing/
    /home/user/Desktop/testing/testing2/
    

    我认为getcwd 用于文件操作,其中dirname(__FILE__) 使用魔术常量__FILE__ 并使用实际文件路径。


    编辑:我错了。

    您可以使用chdir 更改工作目录。

    所以如果你这样做......

    chdir('something');
    echo getcwd()."\n";
    echo dirname(__FILE__)."\n";
    

    那些应该是不同的。

    【讨论】:

    • 不,这次它只是回显 /home/user/Desktop/testing/testing2 两次
    • 好的,让我确定我明白了... dirname(FILE) 将总是 生成正在使用的文件的位置。虽然 getcwd 将为正在运行的 PHP 进程返回当前工作目录(例如我的命令行脚本。)所以假设这一点,如果我使用 include("path/to/some/file/from/chdir/");它应该能够找到引用的文件?
    猜你喜欢
    • 2012-10-05
    • 2011-02-14
    • 2011-08-16
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多