# php-support **Repository Path**: liuxiaojinla/php-support ## Basic Information - **Project Name**: php-support - **Description**: 日常开发必备基础库【字符串、集合、数值、哈希、加密、时间、文件、反射、重试、服务器、XML】 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 3 - **Created**: 2022-05-07 - **Last Updated**: 2025-10-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: PHP ## README # Support 库文档 ## 概述 `support` 库是一个功能全面的 PHP 基础库,旨在为开发者提供日常开发中所需的各类工具和实用功能。无论是处理字符串、操作集合、进行加密、管理文件,还是处理时间、反射和 XML,都能为你提供简洁高效的解决方案。 ## 许可证 本项目采用 Apache-2.0 许可证 - 详情请参见 LICENSE 文件。 ## 安装方式 使用 Composer 安装: ```bash composer require xin/support ``` ## 模块与功能 ### 基础工具 | 模块 | 描述 | |------|------| | `Arr.php` | 数组操作工具类(如过滤、提取、点符号访问等) | | `Str.php` | 字符串处理工具(如检查前缀/后缀、驼峰命名转换、随机字符串生成等) | | `File.php` | 文件系统操作(如检查文件存在性、读取内容、文件哈希计算等) | | `Number.php` | 数值计算辅助工具 | | `Time.php` | 时间处理(包括格式化、解析、时间范围计算等) | | `Regex.php` | 正则表达式验证函数(邮箱、URL、手机号等) | | `Process.php` | 进程管理工具 | | `Reflect.php` | 基于反射的类和方法操作 | | `Xml.php` | XML 解析功能 | | `Json.php` | JSON 编码/解码,增强错误处理 | | `Position.php` | 地理位置坐标间距离计算及坐标系转换 | | `Path.php` | 路径操作工具 | | `Fluent.php` | 流畅接口模式实现 | | `OS.php` | 获取操作系统信息 | | `Retry.php` | 不可靠操作的重试机制 | | `Pluralizer.php` | 单词复数化功能 | | `Radix.php` | 进制转换工具(如 base64 编码、62进制转换) | | `Version.php` | 语义化版本比较工具 | | `MacroProxy.php` | 对象宏扩展功能 | | `HigherOrderTapProxy.php` | 高阶代理对象,支持流畅方法链 | ### 安全模块 | 模块 | 描述 | |------|------| | `Security\Secure.php` | 证书安全处理 | | `Security\Encrypter.php` | 数据加密和解密工具 | | `Security\Hash.php` | 哈希生成和验证 | | `SimpleEncrypt.php` | 简化版加密器,满足基础加密需求 | ### 限流模块 | 模块 | 描述 | |------|------| | `LimitThrottle.php` | 简单限流器,支持条件执行路径 | ### Web 工具 | 模块 | 描述 | |------|------| | `Web\Javascript.php` | JavaScript 代码生成和渲染 | | `Web\Redirect.php` | HTTP 重定向工具 | | `Web\ServerInfo.php` | 服务器环境信息访问 | | `Web\ClientInfo.php` | 客户端检测和用户代理解析 | ## 使用示例 ### 字符串操作 ```php use Xin\Support\Str; $hello = "hello world!"; echo Str::startsWith($hello, 'hello') ? 'true' : 'false'; // true echo Str::endsWith($hello, 'world!') ? 'true' : 'false'; // true echo Str::contains($hello, 'lo wo') ? 'true' : 'false'; // true // 驼峰与下划线转换 echo Str::snake('camelCase'); // camel_case echo Str::camel('snake_case'); // snakeCase echo Str::studly('snake_case'); // SnakeCase // 生成随机字符串 echo Str::random(10); // 随机10位字符串 echo Str::random(10, 0); // 随机10位数字 // UUID生成 echo Str::uuid(); // 生成UUID对象 echo Str::assignUuid(); // 生成UUID字符串 ``` ### 数组操作 ```php use Xin\Support\Arr; $array = [1, 2, 3, 4, 5]; echo Arr::contains($array, 3) ? 'true' : 'false'; // true $result = Arr::pluck($array, function ($item) { return $item * 2; }); print_r($result); // [2, 4, 6, 8, 10] // 点符号访问数组 $data = [ 'user' => [ 'name' => 'John', 'profile' => [ 'email' => 'john@example.com' ] ] ]; echo Arr::get($data, 'user.name'); // John echo Arr::get($data, 'user.profile.email'); // john@example.com // 设置值 Arr::set($data, 'user.profile.phone', '123456789'); print_r($data); // 包含电话号码的新数组 // 检查值是否存在 echo Arr::has($data, 'user.profile.email') ? 'true' : 'false'; // true ``` ### 集合操作 ```php use Xin\Support\Collection; $collection = new Collection([1, 2, 3, 4, 5]); $result = $collection->map(function ($item) { return $item * 2; })->all(); print_r($result); // [2, 4, 6, 8, 10] $filtered = $collection->filter(function ($item) { return $item > 2; })->all(); print_r($filtered); // [3, 4, 5] // 更多集合操作 $collection->each(function ($item, $key) { echo "Item {$key}: {$item}\n"; }); echo $collection->first(); // 1 echo $collection->last(); // 5 ``` ### 文件系统操作 ```php use Xin\Support\File; if (File::exists('path/to/file.txt')) { echo File::get('path/to/file.txt'); } // 写入文件 File::put('path/to/newfile.txt', 'Hello World'); // 获取文件哈希 $hash = File::hash('path/to/file.txt', File::HASH_ETAG); $md5 = File::hash('path/to/file.txt', File::HASH_MD5); // 获取目录下所有文件 $files = File::files('path/to/directory'); foreach ($files as $file) { echo $file->getPathname() . "\n"; } ``` ### 时间处理 ```php use Xin\Support\Time; echo Time::now(); // 当前时间 echo Time::parse('2023-10-01')->format('Y-m-d'); // 格式化日期 // 时间计算 $nextWeek = Time::addWeeks(time(), 1); $lastMonth = Time::subMonths(time(), 1); // 获取时间范围 [$start, $end] = Time::todayRange(); [$start, $end] = Time::weekRange(); [$start, $end] = Time::monthRange(); // 格式化相对时间 echo Time::formatRelative(strtotime('-2 hours')); // 2小时前 // 格式化时长 echo Time::formatDuration(3661); // 1小时1分1秒 ``` ### 加密操作 ```php use Xin\Support\SimpleEncrypt; use Xin\Support\Security\Encrypter; use Xin\Support\Security\Hash; // 简单加密 $encrypted = SimpleEncrypt::encrypt('secret message', 'mykey'); $decrypted = SimpleEncrypt::decrypt($encrypted, 'mykey'); // 高级加密 $encryption = new Encrypter('my-encryption-key'); $encrypted = $encryption->encrypt('secret data'); $decrypted = $encryption->decrypt($encrypted); // 哈希处理 $hash = new Hash(); $hashedPassword = $hash->make('password123'); $isVerified = $hash->verify('password123', $hashedPassword); ``` ### 反射操作 ```php use Xin\Support\Reflect; $reflection = Reflect::on('SomeClass'); $reflection->call('someMethod'); // 获取类属性 $value = Reflect::get($object, 'privateProperty'); Reflect::set($object, 'privateProperty', 'newValue'); ``` ### 重试机制 ```php use Xin\Support\Retry; Retry::make(function ($attempts) { // 可能会失败的操作 if ($attempts < 3) { throw new Exception("Failed attempt {$attempts}"); } return "Success on attempt {$attempts}"; }, 5)->invoke(); // 最多重试5次 ``` ### 限流器 ```php use Xin\Support\LimitThrottle; LimitThrottle::general( function () { // 获取当前计数 return (int) cache()->get('counter', 0); }, function ($limits, $value) { // 当达到限制时执行的操作 echo "Limit reached at {$value}\n"; return true; } ); ``` ### 版本比较 ```php use Xin\Support\Version; echo Version::compare('1.0.0', '1.0.1'); // -1 echo Version::compare('1.0.1', '1.0.0'); // 1 echo Version::compare('1.0.0', '1.0.0'); // 0 // 便捷方法 echo Version::gt('1.0.1', '1.0.0') ? 'true' : 'false'; // true echo Version::eq('1.0.0', '1.0.0') ? 'true' : 'false'; // true echo Version::lt('1.0.0', '1.0.1') ? 'true' : 'false'; // true ``` ### XML 解析 ```php use Xin\Support\Xml; $xml = Xml::parse('value'); echo $xml['child']; // value // 转换为XML $array = ['name' => 'John', 'age' => 30]; $xmlString = Xml::encode($array, 'person'); ``` ### UBB 代码解析 ```php use Xin\Support\Str; $ubb = '[b]Bold Text[/b]'; $html = Str::ubbToHtml($ubb); // Bold Text ``` ### 流畅接口 ```php use Xin\Support\Fluent; $fluent = new Fluent(['key' => 'value']); echo $fluent->get('key'); // value $fluent->set('newKey', 'newValue'); print_r($fluent->all()); // ['key' => 'value', 'newKey' => 'newValue'] // 链式调用 $fluent->merge(['another' => 'value']) ->except('key') ->only(['newKey', 'another']); ``` ### 高阶对象代理 ```php use Xin\Support\HigherOrderTapProxy; $proxy = new HigherOrderTapProxy($object); $proxy->method(function ($item) { // 对对象进行操作 }); ``` ### 对象宏扩展 ```php use Xin\Support\MacroProxy; // 使用自定义宏扩展对象 $proxy = new MacroProxy($object); $proxy->macro('macroName', function ($item) { // 在此处定义宏逻辑 }); ``` ### 正则表达式 ```php use Xin\Support\Regex; echo Regex::isEmail('example@example.com') ? '有效邮箱' : '无效邮箱'; echo Regex::isUrl('https://example.com') ? '有效URL' : '无效URL'; echo Regex::isMobile('13800138000') ? '有效手机号' : '无效手机号'; echo Regex::isUsername('username', 3, 20) ? '有效用户名' : '无效用户名'; ``` ### 服务器信息 ```php use Xin\Support\Web\ServerInfo; echo ServerInfo::isLocalhost() ? '本地运行' : '非本地'; echo ServerInfo::ip(); // 服务器IP地址 ``` ### JavaScript 生成 ```php use Xin\Support\Web\Javascript; Javascript::render('console.log("Hello, World!");'); ``` ### 距离计算 ```php use Xin\Support\Position; $distance = Position::calcDistance( 34.052235, -118.243683, 40.712776, -74.005974 ); echo $distance; // 计算出的距离(公里) // 坐标系转换 [$gcjLat, $gcjLng] = Position::gps84ToGcj02(34.052235, -118.243683); [$bdLat, $bdLng] = Position::gcj02ToBD09($gcjLat, $gcjLng); ``` ### 进制转换 ```php use Xin\Support\Radix; // 62进制转换 $converter = Radix::radix62(); $encoded = $converter->generate(12345); // 数字转62进制 $decoded = $converter->parse($encoded); // 62进制转数字 // Base64 echo base64_encode('Hello, World!'); echo base64_decode('SGVsbG8sIFdvcmxkIQ=='); ``` ### 页面重定向 ```php use Xin\Support\Web\Redirect; Redirect::redirect('https://example.com', 3, '页面将在3秒后跳转...'); ``` ## 贡献 欢迎贡献!请提交拉取请求或开启议题来报告任何错误或功能请求。