20250624
* В класс VersionInfo добавлен метод CompareWithRange (требует улучшения)
This commit is contained in:
		| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\classes; | ||||
|  | ||||
| use goodboyalex\php_components_pack\enums\VersionCompareRangeOption; | ||||
| use goodboyalex\php_components_pack\enums\VersionInfoStage; | ||||
| use goodboyalex\php_components_pack\extensions\StringExtension; | ||||
|  | ||||
| @@ -292,4 +293,75 @@ final class VersionInfo | ||||
|         // Получаем строковое представление версии и возвращаем его | ||||
|         return $this->ToString(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяет, находится ли текущая версия в заданном диапазоне. | ||||
|      * | ||||
|      * @param VersionInfo|null $left Левая граница диапазона или null, если граница не задана (будет использована | ||||
|      *     минимальная версия). | ||||
|      * @param VersionInfo|null $right Правая граница диапазона или null, если граница не задана (будет использована | ||||
|      *     максимальная версия). | ||||
|      * @param ObjectArray|null $options Опции проверки (по умолчанию массив, который разрешает включать границы). | ||||
|      * | ||||
|      * @return int Возвращает 1, если текущая версия старше интервала, 0, если находится в интервале, -1, если текущая | ||||
|      *     версия младше интервала. | ||||
|      * | ||||
|      * @since 1.0.27 | ||||
|      */ | ||||
|     public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null, | ||||
|         ?ObjectArray $options = null): int | ||||
|     { | ||||
|         // Подготавливаем опции, если они не переданы | ||||
|         $options ??= new ObjectArray([ | ||||
|             VersionCompareRangeOption::LeftBorderIncluded, | ||||
|             VersionCompareRangeOption::RightBorderIncluded | ||||
|         ]); | ||||
|  | ||||
|         // Минимальная версия (случай, когда левая граница не указана) | ||||
|         $minVersion = new VersionInfo(0, 0, 0, 0, VersionInfoStage::PreAlpha, 0); | ||||
|  | ||||
|         // Максимальная версия (случай, когда правая граница не указана) | ||||
|         $maxVersion = new VersionInfo(PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, VersionInfoStage::Stable); | ||||
|  | ||||
|         // Устанавливаем левую границу | ||||
|         $leftBorder = $left ?? $minVersion; | ||||
|  | ||||
|         // Устанавливаем правую границу | ||||
|         $rightBorder = $right ?? $maxVersion; | ||||
|  | ||||
|         // Проверяем текущую версию относительно границ | ||||
|         $compareLeft = $this->CompareWith($leftBorder); | ||||
|         $compareRight = $this->CompareWith($rightBorder); | ||||
|  | ||||
|         // Проверяем, что границы включены | ||||
|         // - левая | ||||
|         $leftBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option) | ||||
|             => $option === VersionCompareRangeOption::LeftBorderIncluded); | ||||
|         // - правая | ||||
|         $rightBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option) | ||||
|             => $option === VersionCompareRangeOption::RightBorderIncluded); | ||||
|  | ||||
|         // Проверяем включение границ | ||||
|         $isInInterval = | ||||
|             ( | ||||
|                 ($compareLeft >= 0 && $leftBorderIncluded) | ||||
|                 || ($compareLeft > 0) | ||||
|             ) | ||||
|             && ( | ||||
|                 ($compareRight <= 0 && $rightBorderIncluded) | ||||
|                 || ($compareRight < 0) | ||||
|             ); | ||||
|  | ||||
|         // Итоговая обработка результатов | ||||
|         if ($isInInterval) | ||||
|             // - версия в пределах диапазона | ||||
|             return 0; | ||||
|         else // - версия не в пределах диапазона, и если она младше левой границы (или равна ей при не включении границы) | ||||
|             if ($compareLeft <= 0) | ||||
|                 // -- то возвращаем -1 | ||||
|                 return -1; | ||||
|             else | ||||
|                 // -- в противном случае, версия старше правой границы (или равна ей при не включении границы) | ||||
|                 return 1; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								sources/enums/VersionCompareRangeOption.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								sources/enums/VersionCompareRangeOption.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\enums; | ||||
|  | ||||
| use goodboyalex\php_components_pack\traits\EnumExtensionsTrait; | ||||
|  | ||||
| /** | ||||
|  * Перечисление параметров для сравнения версий на промежутке. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.0.27 | ||||
|  */ | ||||
| enum VersionCompareRangeOption: int | ||||
| { | ||||
|     // Подключаю расширение для Enum | ||||
|     use EnumExtensionsTrait; | ||||
|  | ||||
|     /** | ||||
|      * Левая граница включается в диапазон. | ||||
|      */ | ||||
|     case LeftBorderIncluded = 0; | ||||
|  | ||||
|     /** | ||||
|      * Правая граница включается в диапазон. | ||||
|      */ | ||||
|     case RightBorderIncluded = 1; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user