Получить 2 уровня от dirname (__FILE__) - PullRequest
28 голосов
/ 28 июня 2011

Как я могу вернуть путь из текущего файла, только 2 каталога вверх?

Так что, если мой текущий URL-адрес файла возвращается theme/includes/functions.php

Как я могу вернуть "theme /"

В настоящее время я использую

return dirname(__FILE__)

Ответы [ 7 ]

86 голосов
/ 28 июня 2011

PHP 7

return dirname(__FILE__, 2);

PHP 4 и выше

return dirname(dirname(__FILE__));

С PHP7 вы можете подняться дальше по дереву каталогов, указав параметр level, в то время как PHP до 7 потребует дальнейшего вложения функции dirname.

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

39 голосов
/ 28 июня 2011

Даже проще, чем dirname(dirname(__FILE__)); использует __ DIR __

dirname(__DIR__);

, который работает с php 5.3 и выше.

4 голосов
/ 22 июня 2013
[ web root ]
    / config.php
    [ admin ] 
        [ profile ] 
            / somefile.php 

Как вы можете включить config.php в somefile.php? Вам нужно использовать dirname со структурой из 3 каталогов из текущего файла somefile.php.

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

dirname(dirname(dirname(__FILE__))) . '/config.php'; # 3 directories up to current file
2 голосов
/ 22 апреля 2016

Поздно к вечеринке, но вы также можете сделать что-то, как показано ниже, используя \..\..\ столько раз, сколько необходимо для перехода на более высокий уровень каталогов.

$credentials = require __DIR__ . '\..\App\Database\config\file.php';

Что эквивалентно:

$credentials = dirname(__DIR__) . '\App\Database\config\file.php';

Преимущество состоит в том, что он избегает необходимости вкладывать имя dirname как:

dirname(dirname(dirname(__DIR__))

Обратите внимание, что это тестируется на сервере IIS - не уверен насчет сервера linux, но я не понимаю, почему он не будет работать.

1 голос
/ 03 октября 2014

Как предлагает @geo, вот расширенная функция dirname, которая принимает 2-й параметр с глубиной поиска по 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 голосов
/ 29 ноября 2016

Это старый вопрос, но он важен.

Используйте:

basename(dirname(__DIR__));

, чтобы вернуть только имя второй родительской папки - в данном случае "theme".

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

0 голосов
/ 22 ноября 2016
require_once(dirname(__FILE__) . "/../../functions.php");
...