semelapavel / php-util
PHP实用工具,使生活更简单。
Requires
- php: >=7.4
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpstan/phpstan: ^0.12.82
- phpunit/phpunit: ^9.1
README
关于
PHP-Util库是一系列有用的PHP类,使生活更简单。
安装
使用包管理器composer安装php-util。
composer require semelapavel/php-util
目录
对象
Object\ClassLoader
一个简单的PSR-4自动加载器,使用命名空间加载所需类所在的文件。
$classLoader = new \SemelaPavel\Object\ClassLoader(); $classLoader->addNamespace('MyNamespace', '/src/myApp'); $classLoader->addDirectory('/src/other'); $classLoader->register();
在这个例子中,classLoader将尝试在/src/myApp目录中查找以MyNamespace为前缀的每个完全限定的类文件:\MyNamespace\Class应作为/src/myApp/Class.php找到。
如果找不到文件,或者文件没有MyNamespace前缀,类加载器将尝试在/src/other目录中通过完全限定的类名查找文件:\MyNamespace\Class应作为/src/other/MyNamespace/Class.php找到。
Object\Byte
此类封装一个整数值,并将其表示为二进制字节。
$byte = new Byte(1024); echo $byte; // 1024 echo $byte->floatValue('KB'); // 1 echo $byte->floatValue('MB', 5); // 0,00098
任何值及其指定的二进制单位
$byte = Byte::from(2.5, 'MB'); // 2621440
轻松解析php.ini值
$byte = Byte::fromPhpIniNotation(ini_get('upload_max_filesize'));
解析任何字符串中的字节值
$byte = Byte::parse('8'); // 8 $byte = Byte::parse('16B'); // 16 $byte = Byte::parse('1 KiB'); // 1024 $byte = Byte::parse('0,5MB'); // 524288
文件
File命名空间包含一组用于文件操作的类。
File\File
此类的实例表示文件系统中的一个文件。在创建File对象时,文件不需要存在,也不需要可读。此类扩展了来自标准PHP库 (SPL) 的\SplFileInfo类。
$file = new File('file.txt'); echo $file->getMimeType(); // 'text/plain' $content = $file->getContents(); // Reads the file and returns its contents as a string.
检查文件名是否安全且适用于大多数操作系统
$file->hasValidName(); // Returns true in this example.
而不创建对象
File::isValidFileName('file.txt/'); // false
从文件名末尾删除ASCII控制字符、空白字符、斜杠、点和反斜杠
File::rtrimFileName('file.txt/'); // Returns 'file.txt' in this example.
File\FileFilter
此类的实例有助于通过文件名、文件大小、特定日期和时间或日期时间范围过滤掉不需要的文件。
$filter = new FileFilter(); $filter->setFileNameWhiteList(['*.jpg', '*.png', '*.gif']); $filter->setFileNameBlackList(['*.php.*']); $filter->setFileNameRegex(new \SemelaPavel\String\RegexPattern('^[^0-9]*$')); $filter->setFileSize('>1 KB < 1 MB'); $filter->setMTime('>= 2021-01-01 < 2021-01-02 12:00');
假设有一个名为image.jpg的文件,大小为4 KB,修改时间为2021-01-01
$filter->fileNameMatch('image.jpg') // true $filter->compareFileSize(4096); // true $filter->compareMTime('2021-01-01 13:37'); // true
Http
Http命名空间包含一组处理HTTP请求和响应的类。
Http\FileUpload
FileUpload提供了获取标准化文件上传数据的基本功能,以便进行进一步处理。文件数组中的每个叶子节点都是UploadedFile的实例,或者在发生错误UPLOAD_ERR_NO_FILE时为null。
以下是简化后的代码示例
<form action="" method="post" enctype="multipart/form-data"> Select file to upload: <input type="file" name="file"><br> Select file to upload: <input type="file" name="filesArray[]"><br> Select file to upload: <input type="file" name="filesArray[]"><br> <input type="submit" value="Upload files" name="upload_submit"> </form>
$upload = new FileUpload(); $files = $upload->getUploadedFiles(); if ($files['file']) { $files['file']->move(dirname(__DIR__) . '/upload/', 'newFile.txt'); // move the file with rename } if ($files['filesArray'][0]) { $files['filesArray'][0]->move(dirname(__DIR__) . '/upload/'); }
分页
一组用于管理网页分页的有用类。
Pagination\Paginator
简单的分页计算器,帮助计算特定项目数量、每页项目数、偏移量等。以下是一个示例,其中项目总数设置为100,每页项目数设置为5,当前页设置为5。
$paginator = new Paginator(100, 5, 5); $paginator->getCurrentPage(); // 5 $paginator->getNumOfPages(); // 20 $paginator->getCurrentPageLength(); // 5 = number of page items $paginator->getOffset(); // 20 = current page contains items nr. 21-25 $paginator->getFirstPage(); // 1 $paginator->getLastPage(); // 20 $paginator->isFirst(); // false $paginator->isLast(); // false $paginator->getNextPage(); // 6 $paginator->getPrevPage(); // 4
Pagination\Pagination
为高级分页添加方法的Paginator扩展。以下是一个示例,其中项目总数设置为100,每页项目数设置为5,当前页设置为5。
$pagination = new Pagination(100, 5, 5); $pages = $pagination->toArray(1, 2);
$pages数组结构如下所示
[
['page' => 1, 'isCurrent' => false],
['page' => null, 'isCurrent' => false],
['page' => 3, 'isCurrent' => false],
['page' => 4, 'isCurrent' => false],
['page' => 5, 'isCurrent' => true],
['page' => 6, 'isCurrent' => false],
['page' => 7, 'isCurrent' => false],
['page' => null, 'isCurrent' => false],
['page' => 20, 'isCurrent' => false]
]
字符串
String\RegexPattern
此类表示正则表达式模式。
简单模式示例
$pattern = new RegexPattern('[a-z]{3}', RegexPattern::CASE_INSENSITIVE); if ($pattern->isValid()) { \preg_match((string) $pattern, 'aBc'); // 1 $pattern->match('aBc'); // true }
带有绑定示例的模式
$pattern = new RegexPattern('[a-z]{3}bind', 0, array('bind' => '.value')); echo $pattern; // ~[a-z]{3}\.value~
时间
时间\节假日
ArrayAccess 类处理节假日并提供一些额外功能。
$holidays = new Holidays(); $holidays[Holidays::goodFriday(2021)] = "Good Friday"; $holidays[Holidays::easterMonday(2021)] = "Easter Monday"; $holidays["2021-05-01"] = "May Day"; echo $holidays['2021-05-01']; // "May Day" foreach ($holidays->toArray() as $date => $description) { echo $date . ': ' . $description . '<br>'; }
时间\日历
此类帮助进行日期计算。
$today = new \DateTime(); Calendar::isDayOff($today); $prevWorkday = Calendar::prevWorkday($today); $nextWorkday = Calendar::nextWorkday($today); $lastDayOfPrevMonth = Calendar::lastDayOfPrevMonth($today); $lastDayOfMonth = Calendar::lastDayOfMonth($today);
当设置 节假日 对象时
$holidays = new Holidays(); $holidays["2021-05-01"] = "May Day"; $today = new \DateTime(); Calendar::isDayOff($today, holidays); $prevWorkday = Calendar::prevWorkday($today, holidays); $nextWorkday = Calendar::nextWorkday($today, holidays);
时间\LocalDateTime
此类是 DateTime 工厂。此类中所有函数都使用默认时区。
LocalDateTime::setLocalTimeZone(new \DateTimeZone('Europe/Prague')); $dateTimeStr = ' 2020- 07 - 06 T 13 :37 : 00 . 001337 + 02: 00 '; $normalizedDateTimeStr = LocalDateTime::normalize($dateTimeStr); // "2020-07-06T13:37:00.001337+02:00" $localDateTime = LocalDateTime::parse($normalizedDateTimeStr); $now = LocalDateTime::now(); $today = LocalDateTime::today(); $now->format(LocalDateTime::SQL_DATETIME) // 'Y-m-d H:i:s' format