77 lines
1.9 KiB
PHP
77 lines
1.9 KiB
PHP
|
<?php
|
|||
|
|
|||
|
declare(strict_types=1);
|
|||
|
|
|||
|
namespace Mirzaev\Feip\Params;
|
|||
|
|
|||
|
use Mirzaev\Feip\Error;
|
|||
|
|
|||
|
/**
|
|||
|
* Параметр возраста
|
|||
|
*
|
|||
|
* @property int $age Возраст
|
|||
|
*
|
|||
|
* @package Mirzaev\Feip\Params
|
|||
|
* @author Арсен Мирзаев <red@hood.su>
|
|||
|
*/
|
|||
|
trait Age
|
|||
|
{
|
|||
|
/**
|
|||
|
* Возраст: параметр
|
|||
|
*
|
|||
|
* @var int
|
|||
|
*/
|
|||
|
protected int $age = 0;
|
|||
|
|
|||
|
/**
|
|||
|
* Возраст: фильтр
|
|||
|
*
|
|||
|
* @param string|int|float $target Значение для фильтрации
|
|||
|
*
|
|||
|
* @return int|null
|
|||
|
*/
|
|||
|
public static function age($target): ?int
|
|||
|
{
|
|||
|
// Очистка
|
|||
|
if ($sanitized = filter_var($target, FILTER_CALLBACK, array('options' => [self::class, 'onlyNumbers']))) {
|
|||
|
// Если очищение вернуло результат
|
|||
|
|
|||
|
// Проверка
|
|||
|
if ($sanitized !== (int) $target) {
|
|||
|
// Если очищенное значение не совпадает с отправленным
|
|||
|
new Error(200, __FUNCTION__);
|
|||
|
} else if (filter_var($sanitized, FILTER_VALIDATE_INT) && $sanitized > 0 && $sanitized <= 150) {
|
|||
|
return (int) $sanitized;
|
|||
|
}
|
|||
|
} else {
|
|||
|
new Error(200, __FUNCTION__);
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Возраст: очистка
|
|||
|
*
|
|||
|
* @param string|int|float $target Значение для очистки
|
|||
|
*
|
|||
|
* @return string|null
|
|||
|
*/
|
|||
|
public static function onlyNumbers($target): int
|
|||
|
{
|
|||
|
// Поиск цифр
|
|||
|
preg_match_all('/[0-9]*/', $target, $match);
|
|||
|
|
|||
|
// Инициализация
|
|||
|
$result = '';
|
|||
|
|
|||
|
// Конкатанация найденных цифр
|
|||
|
foreach ($match[0] as $number) {
|
|||
|
$result .= $number;
|
|||
|
}
|
|||
|
|
|||
|
// В задании было сказано: для номеров тип string
|
|||
|
return (int) $result;
|
|||
|
}
|
|||
|
}
|