處理文件上傳、路徑拼接、文件名提取時,pathinfo()、dirname()、basename() 是最高頻使用的三個函數。本文通過實例詳細解析它們的返回值結構、邊界行為、平台差異與最佳實踐。
<?php
$path = "/www/mywebsite/images/myphoto.jpg";
$info = pathinfo($path);
print_r($info);
/*
Array
(
[dirname] => /www/mywebsite/images
[basename] => myphoto.jpg
[extension] => jpg
[filename] => myphoto // PHP 5.2+ 新增
)
*/
// 直接提取單個元素
echo $info['filename']; // myphoto
echo $info['extension']; // jpg
<?php
pathinfo($path, PATHINFO_DIRNAME); // "/www/mywebsite/images" (string)
pathinfo($path, PATHINFO_BASENAME); // "myphoto.jpg"
pathinfo($path, PATHINFO_EXTENSION); // "jpg"
pathinfo($path, PATHINFO_FILENAME); // "myphoto"
<?php
echo dirname("/www/mywebsite/images/myphoto.jpg"); // /www/mywebsite/images
echo dirname("/www/mywebsite/images/"); // /www/mywebsite
echo dirname("/www/mywebsite/images"); // /www/mywebsite
// 遞歸獲取上 N 級目錄
$path = "/a/b/c/d.txt";
echo dirname($path, 2); // PHP 7.0+ 支援第二參數:/a/b
行為:返回去掉「最後一級組件」後的路徑。若路徑以斜槓結尾,最後一級被視為目錄,返回其父目錄。
<?php
echo basename("/www/mywebsite/images/myphoto.jpg"); // myphoto.jpg
echo basename("/www/mywebsite/images/"); // images
echo basename("/www/mywebsite/images"); // images
// 移除副檔名
echo basename("/www/mywebsite/images/myphoto.jpg", ".jpg"); // myphoto
行為:返回路徑的「最後一級組件」。目錄路徑返回目錄名,文件路徑返回文件名。
| 輸入 | pathinfo() | dirname() | basename() |
|---|---|---|---|
/a/b/c.txt | dirname=/a/b, basename=c.txt, ext=txt, filename=c | /a/b | c.txt |
/a/b/ | dirname=/a, basename=b, ext=, filename=b | /a | b |
/a/b | dirname=/a, basename=b, ext=, filename=b | /a | b |
c.txt | dirname=., basename=c.txt, ext=txt, filename=c | . | c.txt |
.htaccess | filename=.htaccess, ext= | . | .htaccess |
a.b.c.txt | filename=a.b.c, ext=txt | . | a.b.c.txt |
<?php
// Windows 路徑含反斜槓
$winPath = "C:\\www\\images\\photo.jpg";
// pathinfo 自動識別雙斜槓
pathinfo($winPath); // 正常工作
// 但最佳實踐:統一使用 DIRECTORY_SEPARATOR 或正斜槓
$path = "C:/www/images/photo.jpg"; // PHP 內部統一支持正斜槓
// 或
$path = "C:" . DIRECTORY_SEPARATOR . "www" . DIRECTORY_SEPARATOR . "images" . DIRECTORY_SEPARATOR . "photo.jpg";
<?php
// 1. 獲取不含副檔名的文件名
$filename = pathinfo($path, PATHINFO_FILENAME);
// 2. 修改副檔名保存
$newPath = pathinfo($path, PATHINFO_DIRNAME) . '/' . $filename . '.webp';
// 3. 獲取上傳文件擴展名(安全)
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$allowed = ['jpg','png','gif','webp'];
if (!in_array($ext, $allowed)) die('類型不允許');
// 4. 構建緩存目錄結構:/cache/首字母/次字母/文件名
$hash = md5($filename);
$cacheDir = "/cache/{$hash[0]}/{$hash[1]}";
if (!is_dir($cacheDir)) mkdir($cacheDir, 0755, true);
$cacheFile = $cacheDir . '/' . $filename;
<?php
$file = new SplFileInfo("/www/images/photo.jpg");
echo $file->getFilename(); // photo.jpg
echo $file->getBasename('.jpg'); // photo
echo $file->getExtension(); // jpg
echo $file->getPath(); // /www/images
echo $file->getPathname(); // /www/images/photo.jpg
echo $file->getDirname(); // /www/images
echo $file->isFile(); // true
echo $file->getSize(); // 文件大小
echo $file->getMTime(); // 修改時間戳
✅ 面向對象、功能更豐富、可鏈式調用,新項目推薦使用 SplFileInfo。