| 函數 | 功能 | 檢查文件存在性 | 回傳值範例 |
|---|---|---|---|
realpath($path) | 返回規範化絕對路徑(解析 . .. 符號連結) | ✅ 是(不存在回傳 false) | /var/www/html/index.php |
dirname($path) | 返回路徑的目錄部分 | ❌ 否 | /var/www/html |
basename($path, $suffix) | 返回路徑的文件名部分,可選移除後綴 | ❌ 否 | index.php / index (搭配 .php) |
pathinfo($path, $options) | 返回路徑資訊關聯陣列 | ❌ 否 | ['dirname'=>'...', 'basename'=>'...', 'extension'=>'php', 'filename'=>'index'] |
<?php
echo realpath('./../index.php'); // /var/www/index.php (解析相對路徑)
echo realpath('/var/www/link.php'); // /var/www/target.php (解析符號連結)
echo realpath('/not/exist.php'); // false
?>
**用途**:安全路徑驗證、防止目錄遍歷攻擊、獲取項目根目錄 realpath(__DIR__ . '/../')。
<?php
$path = '/var/www/html/index.php';
echo dirname($path); // /var/www/html
echo basename($path); // index.php
echo basename($path, '.php'); // index
// 即使文件不存在也正常工作
echo dirname('/fake/path/file.txt'); // /fake/path
?>
<?php
$path = '/var/www/html/image.png';
$info = pathinfo($path);
/*
Array(
[dirname] => /var/www/html
[basename] => image.png
[extension] => png
[filename] => image
)
*/
// 只需特定資訊,用常數(效能略優)
echo pathinfo($path, PATHINFO_EXTENSION); // png
echo pathinfo($path, PATHINFO_FILENAME); // image
?>
<?php
// 1. 獲取項目根目錄(遞歸向上找標誌文件)
function getProjectRoot($start = __DIR__) {
$dir = realpath($start);
while ($dir && $dir !== '/') {
if (file_exists($dir . '/composer.json')) return $dir;
$dir = dirname($dir);
}
return false;
}
// 2. 安全包含文件(防止目錄遍歷)
function safeInclude($relativePath, $baseDir = __DIR__) {
$fullPath = realpath($baseDir . '/' . $relativePath);
$baseDir = realpath($baseDir);
if ($fullPath && strpos($fullPath, $baseDir) === 0) {
return include $fullPath;
}
throw new Exception('Invalid path');
}
// 3. 處理上傳文件名(保留副檔名,主文件名安全化)
function sanitizeFilename($original) {
$info = pathinfo($original);
$safeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $info['filename']);
return $safeName . '.' . strtolower($info['extension']);
}
?>
\,PHP 函數**統一支援 /**,建議全程使用 /DIRECTORY_SEPARATOR 常數適配當前系統,但現代 PHP 內部已統一處理.lnk **不會**被 realpath 解析**記住一句口訣**:「realpath 查真身,dirname 取目錄,basename 取名字,pathinfo 全要」**。根據需求選擇:需驗證存在用 realpath,純字串拆解用 dirname/basename/pathinfo,效能與語義最優。**