Sommaire
Si comme moi sur nodejs vous utiliser la fonction bien pratique path.join() mais que vous ne la trouver pas sur PHP. Normal, elle existe pas. Je vous propose une alternative avec cette fonction joinPath, ci-dessous. Si vous ne la connaissait pas, elle permet de joindre des morceaux de chemin sans se soucier si il faut utiliser les « / » sur windows ou les « \ » sur linux. Bien que la constante magique de PHP « DIRECTORY_SEPARATOR » permet d’outre passer cette problématique, il s’avère que les chemins deviennent très vite long.
Fonction : version simple
La fonction peut être utile dans les require, require_once, les chargement de fichiers, etc.
function joinPath()
{
$path = join(DIRECTORY_SEPARATOR, func_get_args());
if( is_dir($path) ):
$path .= DIRECTORY_SEPARATOR;
endif;
return $path;
}
Fonction version complexe
function pathJoin(string|null ...$parts): string
{
$parts = array_values(array_filter(
$parts,
static fn ($part) => $part !== null && $part !== ''
));
if ($parts === []) {
return '';
}
$separator = DIRECTORY_SEPARATOR;
$first = array_shift($parts);
$isAbsolute = str_starts_with($first, '/')
|| str_starts_with($first, '\\');
$parts = [
trim($first, '/\\'),
...array_map(
static fn ($part) => trim($part, '/\\'),
$parts
),
];
$parts = array_filter($parts, static fn ($part) => $part !== '');
$path = implode($separator, $parts);
return $isAbsolute ? $separator . $path : $path;
}
Utilisation
Exemple d’utilisation de la fonction. Vous pouvez passer autant d’argument que vous le souhaité.
// Avec des fichiers
$path = joinPath(__DIR__, '..', 'src', 'Entity.class.php');
$path = pathJoin(__DIR__, 'cache', $environment, 'data.json');
// Avec des dossiers
$path = pathJoin(__DIR__, 'storage', 'users', (string) $userId, 'photos');
Bonus
C’est la même fonction, mais avec un test pour vérifier si elle existe. C’est pratique pour ne pas entrer en conflit avec une future version de PHP ou si vous utilisez une librairie qui l’implémente déjà.
if(!function_exists('joinPath'))
{
function joinPath()
{
$path = join(DIRECTORY_SEPARATOR, func_get_args());
if( is_dir($path) ):
$path .= DIRECTORY_SEPARATOR;
endif;
return $path;
}
}