You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:32:47