从dirname(__FILE__)向上提升2个级别

33

如何从当前文件返回其路径名,仅返回2个目录?

因此,如果我当前的文件URL返回theme/includes/functions.php

如何返回“theme /”?

目前我正在使用

return dirname(__FILE__)
7个回答

97

PHP 5.3+

return dirname(__DIR__);

PHP 5.2 及更低版本

return dirname(dirname(__FILE__));

通过指定第二个参数到 dirname,PHP7可以在目录树中进一步向上移动。在版本7之前的版本中,需要进一步嵌套 dirname

http://php.net/manual/en/function.dirname.php


这种方法相对于 dirname(__FILE__).'/../'; 的主要优点是消除 DIRECTORY_SEPARATOR 可能带来的不一致性吗? - Patrick
1
@Patrick,我认为这种方法的主要优点是我们可以获得目录的绝对路径,而不是相对路径。此外,DIRECTORY_SEPARATOR的不一致通常是边缘情况,因为PHP会自动将*nix风格的分隔符转换为大多数情况下适用的Windows风格分隔符。 - Charles Sprayberry
4
如果你需要上升3个或更多层级,使用dirname(__FILE__, 3);会很方便。希望dirname函数可以有第二个参数$levels来指定层级数。 :-) - Geo
1
@Patrick 另一种确保使用正确DIRECTORY_SEPARATOR的策略是将路径包装在realpath()中。 - Jorge Orpinel Pérez
2
从PHP 7开始,dirname()函数有第二个参数levels。请参考http://php.net/manual/en/function.dirname.php。 - rocknrollcanneverdie

39

使用__DIR__dirname(dirname(__FILE__))还要更简单。

dirname(__DIR__);

这个方法适用于 PHP 5.3 及以上版本。


4
[ web root ]
    / config.php
    [ admin ] 
        [ profile ] 
            / somefile.php 

如何在somefile.php中包含config.php?您需要使用dirname和当前somefile.php文件的三个目录结构。

require_once dirname(dirname(dirname(__FILE__))) . '/config.php'; 

dirname(dirname(dirname(__FILE__))) . '/config.php'; # 3 directories up to current file

2
迟来的建议,但您也可以像下面这样做,使用\..\..\多次移动目录级别。 $credentials = require __DIR__ . '\..\App\Database\config\file.php'; 相当于: $credentials = dirname(__DIR__) . '\App\Database\config\file.php'; 好处是避免了嵌套dirname的情况,例如: dirname(dirname(dirname(__DIR__)) 请注意,这在IIS服务器上进行了测试-不确定Linux服务器是否有效,但我认为它应该有效。

还可以考虑使用realpath(),例如realpath(__DIR__ . '/../../'),向上跳两个级别。 - puiu

2

根据@geo的建议,这是一个增强版的dirname函数,它接受第二个参数以指定dirname搜索深度:

/**
 * Applies dirname() multiple times.
 * @author Jorge Orpinel <jorge@orpinel.com>
 * 
 * @param string $path file/directory path to beggin at
 * @param number $depth number of times to apply dirname(), 2 by default
 * 
 * @todo validate params
 */
function dirname2( $path, $depth = 2 ) {

    for( $d=1 ; $d <= $depth ; $d++ )
        $path = dirname( $path );

    return $path;
}

注意:@todo 可能是相关的。
唯一的问题是,如果此函数在外部包含中(例如 util.php)中,则无法使用它来包含这样的文件 :B。

0
require_once(dirname(__FILE__) . "/../../functions.php");

0

(而不是 dirname(dirname(__DIR__));,它返回从 / 到第二个父文件夹的完整路径) - codywohlers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接