当前位置: 首页> 最新文章列表> 如何封装一个增强版的get_client_version工具类

如何封装一个增强版的get_client_version工具类

gitbox 1970-01-01

在 Web 开发中,获取客户端的版本信息(如浏览器、操作系统、设备类型等)是一个常见需求。无论是用于统计分析、功能兼容性判断,还是个性化展示,准确地识别客户端环境都能显著提升用户体验。

PHP 自带的 $_SERVER['HTTP_USER_AGENT'] 提供了基本的客户端信息,但解析它的工作却并不轻松。为了让这项任务变得更高效、便捷,我们可以封装一个功能更强大的 get_client_version 函数工具类,实现自动识别浏览器、操作系统、设备类型甚至 APP 版本等功能。

一、为什么需要封装?

直接使用原始的 User-Agent 字符串存在如下痛点:

  • 字符串格式不统一,解析规则复杂

  • 浏览器、操作系统版本更新频繁,识别方式常常失效

  • 缺乏灵活性和扩展性,难以应对多端应用需求

为了克服这些问题,我们需要一个结构化、模块化、可扩展的工具类。

二、工具类设计思路

我们计划创建一个 ClientVersionHelper 类,具备如下能力:

  • 自动识别浏览器类型与版本(Chrome, Firefox, Safari 等)

  • 自动识别操作系统及版本(Windows, macOS, Linux, Android, iOS)

  • 判断是否为移动设备

  • 支持自定义应用版本头识别(如自研 App 的 UA 格式)

  • 提供统一的结构化返回格式

三、代码实现

下面是一个基本实现,后续你可以根据项目需求进一步扩展:

<?php

class ClientVersionHelper
{
    protected $userAgent;

    public function __construct($userAgent = null)
    {
        $this->userAgent = $userAgent ?: ($_SERVER['HTTP_USER_AGENT'] ?? '');
    }

    public function getClientInfo()
    {
        return [
            'browser' => $this->getBrowser(),
            'os'      => $this->getOS(),
            'device'  => $this->isMobile() ? 'Mobile' : 'Desktop',
            'raw'     => $this->userAgent,
        ];
    }

    protected function getBrowser()
    {
        $ua = $this->userAgent;

        if (preg_match('/Chrome\/([0-9\.]+)/i', $ua, $matches)) {
            return 'Chrome ' . $matches[1];
        }

        if (preg_match('/Firefox\/([0-9\.]+)/i', $ua, $matches)) {
            return 'Firefox ' . $matches[1];
        }

        if (preg_match('/Safari\/([0-9\.]+)/i', $ua) && !preg_match('/Chrome/i', $ua)) {
            return 'Safari';
        }

        if (preg_match('/MSIE ([0-9\.]+)/i', $ua, $matches)) {
            return 'Internet Explorer ' . $matches[1];
        }

        return 'Unknown';
    }

    protected function getOS()
    {
        $ua = $this->userAgent;

        if (preg_match('/Windows NT ([0-9\.]+)/i', $ua, $matches)) {
            return 'Windows ' . $matches[1];
        }

        if (preg_match('/Mac OS X ([0-9_\.]+)/i', $ua, $matches)) {
            return 'macOS ' . str_replace('_', '.', $matches[1]);
        }

        if (preg_match('/Android ([0-9\.]+)/i', $ua, $matches)) {
            return 'Android ' . $matches[1];
        }

        if (preg_match('/iPhone OS ([0-9_]+)/i', $ua, $matches)) {
            return 'iOS ' . str_replace('_', '.', $matches[1]);
        }

        if (preg_match('/Linux/i', $ua)) {
            return 'Linux';
        }

        return 'Unknown';
    }

    protected function isMobile()
    {
        return preg_match('/Mobile|Android|iPhone|iPad/i', $this->userAgent);
    }
}

四、使用示例

只需简单调用即可获取结构化的客户端版本信息:

$clientHelper = new ClientVersionHelper();
$info = $clientHelper->getClientInfo();

echo '<pre>';
print_r($info);
echo '</pre>';

返回结果示例如下:

Array
(
    [browser] => Chrome 120.0.0.0
    [os] => Windows 10.0
    [device] => Desktop
    [raw] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
)

五、拓展方向建议

你可以在现有基础上加入以下扩展:

  • 添加对自定义 UA 标识符的支持,例如你自己的 APP UA 中带有 MyApp/3.4.5

  • 整合 UA 数据库(如 https://gitbox.net/ua-database)以支持更多设备识别

  • 提供缓存机制,提高处理效率

  • 将该类封装为 Composer 包,便于复用和更新

六、结语

封装一个高效的 get_client_version 工具类,不仅能大大简化客户端识别的代码逻辑,也能让你的应用更具可维护性和扩展性。与其每次都去手动解析 User-Agent,不如交给一个强大、可靠的工具类来处理。

随着设备和浏览器类型的不断增多,一个良好的封装将使你的项目在用户识别方面始终处于领先位置。