+ [TwoDimSize]: Класс, описывающий двумерный размер. + [HashGetType]: Перечисление типов получения хэша. + [FileHash]: Класс для работы с хэшем файла или строки.
		
			
				
	
	
		
			183 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace goodboyalex\php_components_pack\classes;
 | |
| 
 | |
| use Exception;
 | |
| use goodboyalex\php_components_pack\interfaces\ISerializable;
 | |
| 
 | |
| /**
 | |
|  * Класс, описывающий двумерный размер.
 | |
|  *
 | |
|  * @author Александр Бабаев
 | |
|  * @package php_components_pack
 | |
|  * @version 1.0
 | |
|  * @since 1.0.5
 | |
|  */
 | |
| final class TwoDimSize implements ISerializable
 | |
| {
 | |
|     /**
 | |
|      * Разделитель частей по умолчанию.
 | |
|      */
 | |
|     public const string DEFAULT_DELIMITER = ':';
 | |
| 
 | |
|     /**
 | |
|      * @var bool $NoNegativeValues Значения не должны быть отрицательными.
 | |
|      */
 | |
|     public bool $NoNegativeValues = true;
 | |
| 
 | |
|     /**
 | |
|      * @var int $Width Длина (публичная)
 | |
|      */
 | |
|     public int $Width {
 | |
|         get {
 | |
|             return $this->pWidth;
 | |
|         }
 | |
|         set {
 | |
|             $this->pWidth = $this->NoNegativeValues ? max($value, 0) : $value;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @var int $Height Ширина (публичная)
 | |
|      */
 | |
|     public int $Height {
 | |
|         get {
 | |
|             return $this->pHeight;
 | |
|         }
 | |
|         set {
 | |
|             $this->pHeight = $this->NoNegativeValues ? max($value, 0) : $value;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @var int $pWidth Длина (приватное)
 | |
|      */
 | |
|     private int $pWidth = 0;
 | |
| 
 | |
|     /**
 | |
|      * @var int $pHeight Ширина (приватное)
 | |
|      */
 | |
|     private int $pHeight = 0;
 | |
| 
 | |
|     /**
 | |
|      * Конструктор.
 | |
|      *
 | |
|      * @param int $width Длина.
 | |
|      * @param int $height Ширина.
 | |
|      * @param bool $noNegativeValues Значения не должны быть отрицательными.
 | |
|      */
 | |
|     public function __construct (int $width = 0, int $height = 0, bool $noNegativeValues = true)
 | |
|     {
 | |
|         $this->Width = $width;
 | |
|         $this->Height = $height;
 | |
|         $this->NoNegativeValues = $noNegativeValues;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Конвертация в строку (магический метод).
 | |
|      *
 | |
|      * @return string Строка.
 | |
|      */
 | |
|     public function __toString (): string
 | |
|     {
 | |
|         return $this->AsString();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Конвертация в строку (расширенный метод).
 | |
|      *
 | |
|      * @param string $delimiter Делитель размера.
 | |
|      *
 | |
|      * @return string Строка.
 | |
|      */
 | |
|     public function AsString (string $delimiter = self::DEFAULT_DELIMITER): string
 | |
|     {
 | |
|         return $this->Width . $delimiter . $this->Height;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @inheritDoc
 | |
|      */
 | |
|     public function Serialize (): string
 | |
|     {
 | |
|         // Получаю строковое значение
 | |
|         $str = $this->AsString("x");
 | |
| 
 | |
|         // Добавляю допустимы ли отрицательные значения
 | |
|         $str .= $this->NoNegativeValues ? "x1" : "x0";
 | |
| 
 | |
|         // Возвращаю строку
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @inheritDoc
 | |
|      */
 | |
|     public function UnSerialize (string $serialized): void
 | |
|     {
 | |
|         // Десериализую строку
 | |
|         $result = explode("x", $serialized);
 | |
| 
 | |
|         // Присваиваю параметры
 | |
|         $this->NoNegativeValues = $result[2] === "1";
 | |
| 
 | |
|         // Объединяю длину и ширину
 | |
|         $tdSize = $result[0] . self::DEFAULT_DELIMITER . $result[1];
 | |
| 
 | |
|         // Пытаюсь получить размер
 | |
|         try {
 | |
|             $result = self::Parse($tdSize, noNegativeValues: $this->NoNegativeValues);
 | |
|         }
 | |
|         catch (Exception $e) {
 | |
|             $result = new TwoDimSize(noNegativeValues: $this->NoNegativeValues);
 | |
|         }
 | |
| 
 | |
|         // Присваиваю длину
 | |
|         $this->Width = $result->Width;
 | |
| 
 | |
|         // Присваиваю ширину
 | |
|         $this->Height = $result->Height;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Получение размера из строки.
 | |
|      *
 | |
|      * @param string $str Строка.
 | |
|      * @param string $delimiter Разделитель размеров.
 | |
|      * @param bool $noNegativeValues Значения не должны быть отрицательными.
 | |
|      *
 | |
|      * @return TwoDimSize Модель размеров.
 | |
|      * @throws Exception Если в строке <code>str</code> не содержится символа <code>delimiter</code> или таких
 | |
|      *     разделителей слишком много.
 | |
|      */
 | |
|     public static function Parse (string $str, string $delimiter = self::DEFAULT_DELIMITER,
 | |
|         bool $noNegativeValues = true): TwoDimSize
 | |
|     {
 | |
|         // Разделяю значения
 | |
|         $splitSizes = explode($delimiter, $str);
 | |
| 
 | |
|         // Проверяю, что массив имеет ровно два элемента
 | |
|         if (count($splitSizes) != 2)
 | |
|             throw new Exception(sprintf("Похоже, что в строке %s не содержится символа «%s» или таких разделителей слишком много!",
 | |
|                 $str, $delimiter));
 | |
| 
 | |
|         // Пытаюсь получить длину
 | |
|         $width = filter_var($splitSizes[0], FILTER_VALIDATE_INT);
 | |
| 
 | |
|         // Если не удалось получить длину
 | |
|         if ($width === false)
 | |
|             $width = 0;
 | |
| 
 | |
|         // Пытаюсь получить ширину
 | |
|         $height = filter_var($splitSizes[1], FILTER_VALIDATE_INT);
 | |
| 
 | |
|         // Если не удалось получить ширину
 | |
|         if ($height === false)
 | |
|             $height = 0;
 | |
| 
 | |
|         // Вывожу значение
 | |
|         return new TwoDimSize($width, $height, $noNegativeValues);
 | |
|     }
 | |
| } |