PHP Path Combine 방법

2025. 6. 4. 22:35프로그램/PHP 초급

PHP에는 Python의 os.path.join()이나 .NET의 Path.Combine()과 같이 운영체제에 관계없이 경로를 안전하게 결합해주는 내장 함수가 없습니다.

하지만 직접 간단한 함수를 만들거나, 특정 라이브러리를 사용해서 이와 유사한 기능을 구현할 수 있습니다.

직접 path_combine 함수 만들기

가장 일반적인 방법은 슬래시(/)를 기준으로 경로를 결합하고, 불필요한 슬래시를 제거하거나 추가하는 방식입니다.

PHP
 
<?php

/**
 * 주어진 경로 세그먼트들을 안전하게 결합합니다.
 * 운영체제에 상관없이 슬래시(/)를 경로 구분자로 사용합니다.
 *
 * @param string ...$paths 결합할 경로 세그먼트들 (가변 인자)
 * @return string 결합된 경로
 */
function path_combine(...$paths): string
{
    $filteredPaths = [];
    foreach ($paths as $path) {
        // 경로의 앞/뒤 슬래시를 제거하고 공백 문자열이 아닌 경우에만 추가
        $trimmedPath = trim($path, '/');
        if (!empty($trimmedPath) || $trimmedPath === '0') { // '0'과 같은 유효한 경로 세그먼트도 고려
            $filteredPaths[] = $trimmedPath;
        }
    }

    // 빈 경로 세그먼트가 없는 경우 '/'로 결합
    if (empty($filteredPaths)) {
        return ''; // 모든 세그먼트가 비어있으면 빈 문자열 반환
    }

    // 결합된 경로 반환
    return implode('/', $filteredPaths);
}

// 사용 예시:
echo path_combine('uploads', 'images', 'profile.jpg') . PHP_EOL;
// 출력: uploads/images/profile.jpg

echo path_combine('/var/www', 'html', 'index.php') . PHP_EOL;
// 출력: /var/www/html/index.php

echo path_combine('assets/', '/css/', 'style.css') . PHP_EOL;
// 출력: assets/css/style.css

echo path_combine('root', '', 'sub', 'file.txt') . PHP_EOL;
// 출력: root/sub/file.txt

echo path_combine('/a/b/', '/c/d', 'e/f/') . PHP_EOL;
// 출력: /a/b/c/d/e/f

echo path_combine('http://example.com/api', 'v1', 'users') . PHP_EOL;
// 출력: http://example.com/api/v1/users

echo path_combine('//', 'path', '/to/file') . PHP_EOL;
// 출력: path/to/file (선행 슬래시가 하나만 남도록 처리될 수 있음)

echo path_combine('') . PHP_EOL; // 빈 문자열
echo path_combine('/', '/'). PHP_EOL; // 빈 문자열

라이브러리 사용 (Composer)

만약 Composer를 사용하여 프로젝트를 관리하고 있다면, 이미 잘 만들어진 파일 시스템 관련 라이브러리들을 활용할 수 있습니다. 예를 들어, symfony/filesystem 또는 league/flysystem 같은 라이브러리들은 경로 결합 기능을 제공합니다.

symfony/filesystem 예시:

Bash
 
composer require symfony/filesystem
PHP
 
<?php

use Symfony\Component\Filesystem\Path;

// Symfony 4.3+ 버전에서는 Path::join() 사용 가능
echo Path::join('uploads', 'images', 'profile.jpg') . PHP_EOL;
// 출력: uploads/images/profile.jpg

echo Path::join('/var/www', 'html', 'index.php') . PHP_EOL;
// 출력: /var/www/html/index.php

echo Path::join('assets/', '/css/', 'style.css') . PHP_EOL;
// 출력: assets/css/style.css

// 이전 버전의 Symfony FileSystem 컴포넌트에서는 Filesystem 클래스의 makePathRelative() 같은 유틸리티 사용 고려
// 직접적인 path_combine 기능은 Path 유틸리티 클래스에 있습니다.

 

결론적으로:

PHP 자체에는 내장된 path_combine 함수는 없지만, 위 예시처럼 직접 간단한 함수를 만들거나, Composer를 통해 symfony/filesystem과 같은 외부 라이브러리를 사용하는 것이 일반적입니다. 일반적으로 웹 환경에서는 / 슬래시를 사용하므로 직접 함수를 만드는 것이 가장 간편한 경우가 많습니다.