Как надежно разрешить путь относительно другого?

Есть ли в PHP встроенный способ разрешения пути относительно другого?

Например, для заданного каталога $baseDir: /home/ben/project следующий $path должен разрешаться в:

  • /foo/bar/foo/bar
  • ../foo/bar, → /home/ben/foo/bar

Решения, которые приходят на ум:

  • Временное изменение текущего рабочего каталога и использование realpath():

    $currentDir = getcwd();
    chdir($baseDir);
    $resolvedPath = realpath($path);
    chdir($currentDir);
    
    return $resolvedPath;
    

    Это решение немного утомительно.

  • Проверка, является ли путь абсолютным, если нет, с помощью realpath():

    if ($path[0] === '/') {
        return $path;
    }
    
    return realpath($currentDir . '/' . $path);
    

    Это решение не является кросс-платформенным; сделать его безопасным кросс-платформенным может быть не так тривиально, как кажется.

И последнее, но не менее важное: realpath() возвращает false, когда путь не существует, что не учитывается в приведенных выше кодах и может быть проблемой в некоторых случаях использования.

Я что-то пропустил?


person BenMorel    schedule 01.08.2019    source источник
comment
почему вы думаете, что ваше второе решение не является кросс-платформенным?   -  person Giacomo M    schedule 01.08.2019
comment
@GiacomoM Потому что в Windows пути могут начинаться с C:\ , а не с /. А насчёт других ОС я не уверен.   -  person BenMorel    schedule 01.08.2019
comment
В PHP есть константа DIRECTORY_SEPARATOR, которая является кросс-платформенной.   -  person Giacomo M    schedule 01.08.2019
comment
Разделитель каталогов не проблема, / тоже работает в Windows. Проблема заключается в надежной проверке того, является ли путь абсолютным или относительным.   -  person BenMorel    schedule 01.08.2019
comment
До сих пор не понимаю, почему вы считаете, что это не кроссплатформенность   -  person Giacomo M    schedule 01.08.2019
comment
Чтобы проверить, является ли путь абсолютным или относительным, проверьте этот пост stackoverflow.com/questions/7392274/   -  person Giacomo M    schedule 01.08.2019