当前位置: 首页 > news >正文

PHP全局函数与工具类设计

PHP全局函数与工具类设计

全局函数和工具类在项目中很常用。好的设计让工具代码更易用。今天说说PHP中全局函数和工具类的设计。

辅助函数文件。

```php
// helpers.php

function str_limit(string $value, int $limit = 100, string $end = '...'): string
{
if (mb_strlen($value) <= $limit) return $value;
return mb_substr($value, 0, $limit) . $end;
}

function str_random(int $length = 16): string
{
return bin2hex(random_bytes($length / 2));
}

function money_format(float $amount, string $symbol = '¥'): string
{
return $symbol . number_format($amount, 2);
}

function array_only(array $array, array $keys): array
{
return array_intersect_key($array, array_flip($keys));
}

function array_except(array $array, array $keys): array
{
return array_diff_key($array, array_flip($keys));
}

echo str_limit("这是一段很长的文本内容", 6) . "\n";
echo str_random(16) . "\n";
echo money_format(12345.67) . "\n";
?>

工具类的设计。

```php
class Str
{
public static function limit(string $value, int $limit = 100, string $end = '...'): string
{
if (mb_strlen($value) <= $limit) return $value;
return mb_substr($value, 0, $limit) . $end;
}

public static function random(int $length = 16): string
{
return bin2hex(random_bytes($length / 2));
}

public static function slug(string $title): string
{
$title = preg_replace('/[^\x{4e00}-\x{9fff}a-zA-Z0-9\s]/u', '', $title);
$title = preg_replace('/\s+/', '-', trim($title));
return strtolower($title);
}

public static function contains(string $haystack, string $needle): bool
{
return str_contains($haystack, $needle);
}

public static function studly(string $value): string
{
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $value)));
}

public static function camel(string $value): string
{
return lcfirst(self::studly($value));
}
}

class Arr
{
public static function only(array $array, array $keys): array
{
return array_intersect_key($array, array_flip($keys));
}

public static function except(array $array, array $keys): array
{
return array_diff_key($array, array_flip($keys));
}

public static function flatten(array $array): array
{
$result = [];
array_walk_recursive($array, function ($value) use (&$result) {
$result[] = $value;
});
return $result;
}

public static function first(array $array, callable $callback = null, mixed $default = null): mixed
{
foreach ($array as $key => $value) {
if ($callback === null || $callback($value, $key)) {
return $value;
}
}
return $default;
}

public static function pluck(array $array, string $value, ?string $key = null): array
{
$results = [];
foreach ($array as $item) {
$itemValue = data_get($item, $value);
if ($key === null) {
$results[] = $itemValue;
} else {
$itemKey = data_get($item, $key);
$results[$itemKey] = $itemValue;
}
}
return $results;
}
}

echo Str::limit("这是一段很长的文本内容", 6) . "\n";
echo Str::random(16) . "\n";
echo Str::slug("Hello World PHP") . "\n";
print_r(Arr::only(['a' => 1, 'b' => 2, 'c' => 3], ['a', 'c']));
?>

使用trait组织工具方法。

```php
trait Macroable
{
protected static array $macros = [];

public static function macro(string $name, callable $macro): void
{
static::$macros[$name] = $macro;
}

public static function __callStatic(string $method, array $parameters): mixed
{
if (isset(static::$macros[$method])) {
return (static::$macros[$method])(...$parameters);
}
throw new BadMethodCallException("方法不存在: $method");
}
}

class StringHelper
{
use Macroable;
}

StringHelper::macro('greet', fn(string $name) => "Hello, $name!");
echo StringHelper::greet('张三') . "\n";
?>

全局函数和工具类的设计没有定论。使用全局函数或静态工具类都可以。关键是保持命名一致性和团队约定。Laravel的Str和Arr类提供了很好的参考。

http://www.jsqmd.com/news/976193/

相关文章:

  • SteamOS-Waydroid-Installer高级功能:ADBLOCK配置、控制器映射与文件共享教程
  • 2026年数据可视化图表工具推荐:图表类型、交互能力与企业级部署全测评 - 科技焦点
  • 【字节跳动】配置管理模块(config.h)提供配置读取接口 网关主逻辑(gateway_main.c)实现epoll事件循环、客户端连接处理和请求路由 网络基础模块(net_base.h/epoll
  • 如何快速实现黑苹果EFI自动化配置:OpCore-Simplify完全指南
  • 免费音频编辑终极指南:如何用Audacity从零开始制作专业音频作品
  • 源代码论文分享|线上教学平台项目资料,适合毕设/课设参考!
  • 如何用Responsive Boilerplate构建移动端友好的导航菜单与下拉组件
  • MATLAB一键运行:卡尔曼与维纳滤波去噪对比实验包(含仿真图+说明文档)
  • SPT-AKI Profile Editor:重新定义《逃离塔科夫》离线游戏的存档编辑体验
  • Kronos金融大模型:股票预测的革命性突破与完整实战指南
  • 基于Processor Expert的BLDC电机闭环控制系统设计与实践
  • 干货向:上海本地名表变现指南避坑要点与正规回收品牌测评 - 开心测评
  • 如何构建私有照片管理系统:Lychee自托管部署全攻略
  • 2026一次性浴巾哪家品质最好?主流优质品牌综合测评推荐 - 品牌测评鉴赏家
  • 门店实力大比拼!2026 深圳香奈儿包包回收全维度测评,收的顶稳居第一 - 奢侈品回收测评
  • 抖音批量下载器终极指南:3分钟搞定无水印视频批量保存
  • TouchVisualizer完全指南:一行代码实现iOS触摸可视化的终极方案
  • 基于S32K116的无感BLDC电机六步换相控制:外设协同与算法实现
  • 智慧校园后台系统源码:SpringBoot后端+Vue前端+MySQL脚本+详细配置指南
  • 息肉分割刷点秘籍:深入拆解Polyp-PVT中的三个关键模块(CFM/CIM/SAM)
  • OpenCore引导修补技术深度解析:让老旧Mac硬件突破苹果官方限制的终极方案
  • Joplin快捷键终极指南:200+效率操作完全解析
  • 2026重庆月嫂培训学校怎么选?资深从业者实地体验复盘 - 奔跑123
  • 终极指南:如何用BiliDownload快速获取无水印B站视频
  • 059、肤色还原专项调优:记忆色、颜色偏好建模与主观评价标准
  • LPC55S1x低功耗实战:从电源管理到唤醒优化的嵌入式设计
  • 如何实现iOS应用的实时样式重载:Motif Live Reload功能详解
  • 2026可以文生PPT以及生图片的ai推荐:全场景选型指南 - 资讯速览
  • 如何在3分钟内免费将Figma界面完全汉化?FigmaCN完整中文翻译指南
  • 千元内百搭女表排行:兼顾质感与适配性的5款之选 - 互联网科技品牌测评