semelapavel/php-util

PHP实用工具,使生活更简单。

4.0.3 2021-06-28 20:03 UTC

This package is auto-updated.

Last update: 2024-09-29 03:10:22 UTC


README

Latest Stable Version License

关于

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