PHP全局函数与工具类设计
PHP全局函数与工具类设计全局函数和工具类在项目中很常用。好的设计让工具代码更易用。今天说说PHP中全局函数和工具类的设计。辅助函数文件。php// helpers.phpfunction 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;?工具类的设计。phpclass 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组织工具方法。phptrait 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类提供了很好的参考。