Bagaimana cara menyelesaikan jalur yang relatif terhadap jalur lain dengan andal?

Dalam PHP, apakah ada cara bawaan untuk menyelesaikan suatu jalur relatif terhadap yang lain?

Misalnya, dengan $baseDir dir: /home/ben/project, $path berikut harus diselesaikan menjadi:

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

Solusi yang terlintas dalam pikiran:

  • Mengubah sementara direktori kerja saat ini, dan menggunakan realpath():

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

    Solusi ini agak membosankan.

  • Memeriksa apakah jalurnya absolut, jika tidak, menggunakan realpath():

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

    Solusi ini bukan lintas platform; menjadikannya lintas platform dengan aman mungkin tidak sepele seperti yang terlihat.

Terakhir, realpath() mengembalikan false ketika jalur tidak ada, yang tidak diperhitungkan dalam kode di atas, dan mungkin menjadi masalah dalam beberapa kasus penggunaan.

Apakah saya melewatkan sesuatu?


person BenMorel    schedule 01.08.2019    source sumber
comment
mengapa menurut Anda solusi kedua Anda bukan lintas platform?   -  person Giacomo M    schedule 01.08.2019
comment
@GiacomoM Karena di Windows, jalur mungkin dimulai dengan C:\ , bukan /. Dan saya tidak yakin dengan OS lain.   -  person BenMorel    schedule 01.08.2019
comment
PHP memang memiliki DIRECTORY_SEPARATOR konstan yang bersifat lintas platform   -  person Giacomo M    schedule 01.08.2019
comment
Pemisah direktori tidak menjadi masalah, / juga berfungsi pada Windows. Masalahnya adalah memeriksa dengan andal apakah suatu jalur bersifat absolut atau relatif.   -  person BenMorel    schedule 01.08.2019
comment
Masih belum mengerti kenapa menurut Anda tidak lintas platform   -  person Giacomo M    schedule 01.08.2019
comment
Untuk memeriksa apakah jalurnya absolut atau relatif, periksa postingan ini stackoverflow.com/questions/7392274/   -  person Giacomo M    schedule 01.08.2019