pathinfo()
La funzione pathinfo() di PHP divide un percorso file in directory, nome file ed estensione, restituendo un array associativo.
Cos'è la funzione pathinfo()?
La funzione pathinfo() è una funzione integrata di PHP che suddivide un percorso file nelle sue parti — la directory, il nome del file e l'estensione — e le restituisce come array associativo. È lo strumento ideale ogni volta che occorre rispondere a domande come "in quale cartella si trova questo file?" o "qual è l'estensione di un file caricato?" senza dover scrivere la propria logica di parsing delle stringhe.
Un aspetto fondamentale da capire fin da subito: pathinfo() opera esclusivamente sulla stringa fornita. Non accede mai al filesystem, quindi il percorso non deve necessariamente puntare a un file realmente esistente. Questo la rende veloce e sicura da utilizzare su valori forniti dall'utente (ad esempio, il nome originale di un file caricato).
Questa pagina tratta la sintassi, l'array restituito da pathinfo(), come richiedere un singolo componente e i casi limite che possono sorprendere (nessuna estensione, dotfile, estensioni composte).
Sintassi
pathinfo(string $path, int $flags = PATHINFO_ALL): array|string$path— il percorso del file da analizzare. Può essere assoluto o relativo e non è necessario che esista.$flags— opzionale. Se omesso (o impostato suPATHINFO_ALL), la funzione restituisce un array associativo. Se impostato su un singolo flag, restituisce solo quel componente come stringa.
L'array restituito da pathinfo()
Per impostazione predefinita pathinfo() restituisce un array associativo con al massimo quattro chiavi:
| Chiave | Significato | Esempio per /var/www/html/index.php |
|---|---|---|
dirname | La parte relativa alla directory | /var/www/html |
basename | Il nome completo del file con estensione | index.php |
extension | L'estensione (senza il punto) | php |
filename | Il nome del file senza estensione | index |
Qui passiamo il percorso del file e memorizziamo l'array risultante in $info, quindi leggiamo ogni componente tramite la sua chiave.
Importante: la chiave
extensionesiste solo quando il percorso contiene effettivamente un.. Se il percorso non ha estensione, quella chiave sarà semplicemente assente dall'array, quindi accedere direttamente a$info['extension']genererebbe un avviso "Undefined array key". Usare$info['extension'] ?? ''in caso di dubbio.
Restituire un singolo componente
Se è necessaria una sola parte, passare un flag come secondo argomento. I flag disponibili sono PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION e PATHINFO_FILENAME. Con un singolo flag la funzione restituisce una stringa invece di un array:
Questo è il modo più semplice per ottenere solo l'estensione — ad esempio, per verificare che un file caricato sia di un tipo consentito.
Casi limite da tenere a mente
pathinfo() è tollerante, ma alcuni risultati possono sorprendere:
<?php
// 1. No extension: the 'extension' key is missing entirely.
print_r(pathinfo('/etc/hosts'));
// Array ( [dirname] => /etc [basename] => hosts [filename] => hosts )
// 2. Multi-part extension: only the LAST part counts as the extension.
print_r(pathinfo('archive.tar.gz'));
// Array ( [dirname] => . [basename] => archive.tar.gz
// [extension] => gz [filename] => archive.tar )
// 3. Dotfile: the leading dot makes the whole name the "extension".
print_r(pathinfo('/home/user/.bashrc'));
// Array ( [dirname] => /home/user [basename] => .bashrc
// [extension] => bashrc [filename] => )Note:
- Un percorso senza directory (caso 2) riporta
dirnamecome.(la directory corrente). - Per i nomi in stile
.tar.gz,pathinfo()considera sologzcome estensione — non esiste un modo integrato per otteneretar.gzin una singola chiamata. - Un dotfile come
.bashrcviene letto come "un file senza nome con estensionebashrc," che raramente corrisponde a quanto desiderato. Gestire questi casi manualmente se il codice li consente.
Quando usare pathinfo()
Utilizzare pathinfo() quando occorre più di una parte di un percorso alla volta, o quando si preferisce un array nominativo e leggibile invece di ricordare quale funzione dedicata fa cosa:
- Usare
pathinfo($p)per ottenere directory, nome e estensione insieme. - Usare basename() se si vuole solo il nome del file — consente anche di rimuovere un suffisso noto.
- Usare dirname() se si vuole solo la directory, che gestisce più livelli tramite il suo argomento
$levels. - Usare realpath() quando occorre risolvere un percorso rispetto al filesystem reale (symlink,
.., ecc.) — a differenza dipathinfo(), accede al disco e restituiscefalseper i file mancanti.
Per una panoramica più ampia sulla lettura e scrittura di file, vedere PHP File Handling.
Conclusione
pathinfo() è il modo più rapido per suddividere un percorso file in directory, nome base, estensione e nome puro del file. Ricordare che analizza solo la stringa (non verifica mai se il file esiste), che la chiave extension è assente quando non vi è estensione, e che viene riportata solo l'estensione finale per nomi come archive.tar.gz. Per esigenze relative a un singolo componente, le funzioni dedicate basename() e dirname() sono spesso più chiare.