如何在PHP中读取文件元数据及动态获取PHP文件注释块注解?
1. 如何在PHP中读取文件元数据?
文件元数据其实分两种常见场景——文件系统层面的属性(比如大小、修改时间、权限)和文件内容内置的元数据(比如图片的EXIF拍摄信息),我分别给你说几种实用的实现方法:
文件系统层面的元数据
- 使用
stat()函数:这是最全面的方法,它会返回一个包含文件几乎所有系统属性的关联数组,像文件大小、创建时间、修改时间、权限这些信息都能拿到。示例代码:
$filePath = 'example.txt'; $fileStats = stat($filePath); // 输出文件大小 echo "文件大小:" . $fileStats['size'] . " 字节\n"; // 输出最后修改时间(转成可读格式) echo "最后修改时间:" . date('Y-m-d H:i:s', $fileStats['mtime']) . "\n";
- 专用快捷函数:如果你只需要单个属性,PHP提供了更简洁的封装函数,比如
filesize()直接获取文件大小,filemtime()获取最后修改时间,fileperms()获取文件权限,用起来比stat()更省心。
文件内容内置的元数据(以图片EXIF为例)
如果是图片文件,想要读取拍摄时间、相机型号这类EXIF元数据,可以用exif_read_data()函数:
$imagePath = 'photo.jpg'; $exifData = exif_read_data($imagePath); if ($exifData) { echo "拍摄时间:" . $exifData['DateTimeOriginal'] . "\n"; echo "相机型号:" . $exifData['Model'] . "\n"; } else { echo "这张图片没有携带EXIF元数据哦"; }
注意:这个函数需要PHP的EXIF扩展启用,大部分服务器默认是开启的,如果没生效,你可以在php.ini里开启extension=exif配置项。
2. 如何动态读取PHP文件中的注释块注解?
要提取PHP文件里像@author、@copyright这类注释块中的注解信息,最靠谱的方式是用PHP的反射机制,当然也可以手动解析文件内容,我给你两种可行方案:
方案1:反射机制(推荐,适配类/方法/文件级注释)
反射是PHP专门用来分析代码结构的工具,能精准获取类、函数甚至整个文件的注释块。比如你的目标文件example.php内容如下:
<?php /** * @author John Doe (jdoe@example.com) * @copyright MIT */ class ExampleClass {}
我们可以通过ReflectionClass获取类的注释,再解析@author信息:
// 先引入目标文件 require_once 'example.php'; // 创建反射类实例 $reflection = new ReflectionClass('ExampleClass'); // 获取类的注释块内容 $docComment = $reflection->getDocComment(); // 用正则匹配@author后面的内容 if (preg_match('/@author\s+(.*)/', $docComment, $matches)) { echo "作者信息:" . $matches[1] . "\n"; // 输出:John Doe (jdoe@example.com) }
如果目标文件是没有类/函数的纯脚本,你可以用PHP 7.1+支持的ReflectionFile来读取文件顶部注释:
$reflectionFile = new ReflectionFile('example.php'); $docComment = $reflectionFile->getDocComment(); // 同样用正则解析@author if (preg_match('/@author\s+(.*)/', $docComment, $matches)) { echo "作者信息:" . $matches[1] . "\n"; }
方案2:手动读取文件解析注释块
如果你不想用反射,也可以直接读取文件内容,用正则匹配出注释块:
$fileContent = file_get_contents('example.php'); // 匹配/** ... */格式的多行注释块 if (preg_match('/\/\*\*(.*?)\*\//s', $fileContent, $matches)) { $commentBlock = $matches[1]; // 提取@author信息 if (preg_match('/@author\s+(.*)/', $commentBlock, $authorMatches)) { echo "作者信息:" . $authorMatches[1] . "\n"; } }
这里要注意正则的/s修饰符,它能让.匹配换行符,确保捕获到多行注释。不过这种方法不如反射可靠——如果文件里有多个注释块,可能会匹配到错误的内容,反射是基于代码结构的,准确性更高。
内容的提问来源于stack exchange,提问作者Youssef Siam
相关产品推荐
相关产品推荐

