babaev-an e9118609b6 20250626
В класс VersionInfo добавлены статические методы MinVersion и MaxVersion.

Метод CompareWithRange обновлён с учётом новых методов
2025-06-26 21:39:26 +03:00

18 KiB
Raw Blame History

Описание класса VersionInfo

Информация о версии

Версия класса: 1.2

Впервые введено в пакет с версии: 1.0.24 Последнее обновление в версии: 1.0.27

Описание класса: Класс, описывающий информацию о версии.

Публичные свойства и константы класса

В классе определены следующие константы:

  • array StagesNames - имена стадий сборки.
  • string DefaultTemplate - шаблон вывода по умолчанию.

В классе определены следующе свойства:

  • int $Major - мажорная версия (только чтение).
  • int $Minor - минорная версия (только чтение).
  • int $Release - номер релиза (только чтение).
  • int $Build - номер сборки (только чтение).
  • VersionInfoStage $Stage - стадия сборки (только чтение).
  • int $StageNumber - номер стадии сборки (только чтение).

Методы и функции

Конструктор.

Конструктор принимает 4 обязательных и 2 дополнительных параметра:

  • int $Major - мажорная версия (обязательный);
  • int $Minor - минорная версия (обязательный);
  • int $Release - номер релиза (обязательный);
  • int $Build - номер сборки (обязательный);
  • VersionInfoStage $Stage - стадия сборки (по умолчанию, VersionInfoStage::Undefined);
  • int $StageNumber - номер стадии сборки (по умолчанию, 0).

В результате создаётся новый класс VersionInfo.

Пример:

$version = new VersionInfo (1, 0, 0, 0, VersionInfoStage::Beta, 1);

Создаст класс VersionInfo для версии 1.0.0.0 Beta 1.

Преобразование в строку.

За преобразование в строку отвечает 2 метода: ToString и __toString ().

Метод ToString

Этот метод возвращает строковое представление версии. Он содержит 2 необязательных параметра:

  • string $template - шаблон вывода (по умолчанию, DefaultTemplate);
  • array $stagesNames - имена стадий сборки (по умолчанию, StagesNames).

Метод возвращает string - строковое представление версии.

В шаблоне должны присутствовать маркеры:

Маркер Описание Обязательный
#{Major} Мажорная версия ДА
#{Minor} Минорная версия ДА
#{Release} Номер релиза ДА
#{Build} Номер сборки ДА
#{Stage} Стадия сборки НЕТ
#{StageNumber} Номер стадии сборки НЕТ

Эти маркеры в шаблоне заменяются на значения соответствующих свойств.

Синтаксис:

public function ToString (string $template, array $stagesNames): string

Пример,

// Создаю объект
$version = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// Задаю шаблон
$template = #{Major}.#{Minor}.#{Release} (сборка #{Build});

// Вывожу
echo $version->ToString($template);

В результате на экране появится:

1.2.3 (сборка 4)

Метод __toString

Этот метод полностью аналогичен методу ToString с той лишь разницей, что в этом методе невозможно задать параметры вывода (такие, как шаблон и имена стадий). Эти параметры берутся по умолчанию.

Этот метод необходим для вывода корректной информации при попытке привести объект класса VersionInfo к типу string.

Метод возвращает string - строковое представление версии.

Синтаксис:

public function __toString (): string

Пример,

// Создаю объект
$version = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// Вывожу
echo $version;

В результате на экране появится:

1.2.3.4 Beta 5

Сравнение версий

Для сравнения версий используется две аналогичные друг другу (но различающиеся по способу вызова) функции: Compare и CompareWith.

Метод Compare

Это статический метод, который сравнивает две версии, заданные в 2 обязательных параметрах:

  • VersionInfo $version1 - версия 1;
  • VersionInfo $version2 - версия 2.

Этот метод возвращает int:

version1 version2 Результат
Младше Старше -1
Совпадает Совпадает 0
Старше Младше 1

Синтаксис:

public static function Compare (VersionInfo $version1, VersionInfo $version2): int

Пример,

// Создаю объекты
// - $version11 младше $version12
$version11 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);
$version12 = new VersionInfo (1, 2, 3, 5, VersionInfoStage::Beta, 6);

// $version21 совпадает с $version22
$version21 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);
$version22 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// $version31 старше $version32
$version31 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Stable);
$version32 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// Сравниваю
$verCompare1 = VersionInfo::Compare($version11, $version12);
$verCompare2 = VersionInfo::Compare($version21, $version22);
$verCompare3 = VersionInfo::Compare($version31, $version32);

// Вывожу
echo $verCompare1 . '|' . $verCompare2 . '|' . $verCompare3;

В результате на экране появится:

-1|0|1

Метод CompareWith

Этот метод полностью аналогичен методу Compare. Он отличается лишь только тем, что не статичен и вызывается из ранее созданного экземпляра класса. Он сравнивает текущую версию с переданной. Этот метод имеет только 1 обязательный параметр: VersionInfo $version - переданная версия.

Этот метод возвращает int: 1, если текущая версия старше переданной, 0, если совпадает и -1, если текущая версия младше переданной.

Синтаксис:

public function CompareWith (VersionInfo $version): int

Пример,

// Создаю объекты
// - $version11 младше $version12
$version11 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);
$version12 = new VersionInfo (1, 2, 3, 5, VersionInfoStage::Beta, 6);

// $version21 совпадает с $version22
$version21 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);
$version22 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// $version31 старше $version32
$version31 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Stable);
$version32 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);

// Сравниваю
$verCompare1 = $version11->CompareWith($version12);
$verCompare2 = $version21->CompareWith($version22);
$verCompare3 = $version31->CompareWith($version32);

// Вывожу
echo $verCompare1 . '|' . $verCompare2 . '|' . $verCompare3;

В результате на экране появится:

-1|0|1

Метод CompareWithRange

Введено в версии 1.0.27.

Это метод, который проверяет, находится ли текущая версия в заданном диапазоне, указанном в 2 необязательных параметрах:

  • VersionInfo (или null) $left - левая граница, по умолчанию, null;
  • VersionInfo (или null) $right - правая граница, по умолчанию, null.

В случае, если будет передан null вместо левой границы, то метод создаст класс VersionInfo с минимально возможной версией 0.0.0.0 PreAlpha 0, а вместо правой - VersionInfo с максимально возможной версией 9223372036854775807.9223372036854775807.9223372036854775807.9223372036854775807 Stable (здесь 9223372036854775807 - максимальное число INT по умолчанию - у вас может быть другое).

Границы могут совпадать, тогда поведение будет совпадать с методом CompareWith (при условии, что границы включены). Кроме того, работает защита "от дурака" и если границы перепутаны, то метод автоматически поменяет их местами.

3-й необязательный параметр отвечает за параметры сравнения. Это ObjectArray из перечисления VersionCompareRangeOption, который может содержать следующие настройки:

Настройка Описание Включена по умолчанию
LeftBorderIncluded Включена ли левая граница в диапазон ДА
RightBorderIncluded Включена ли правая граница в диапазон ДА

Этот метод возвращает int:

Текущая версия Результат
Младше диапазона -1
Внутри диапазона (или на границе) 0
Старше диапазона 1

Синтаксис:

public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null, ?ObjectArray $options = null): int

Пример,

// Создаю объекты
// - 1.2.3.4 Beta 1
$versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);

// - 1.1.3.4 Alpha 2
$versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2);

// - 1.1.1.1 Alpha 2
$versionInfo3 = new VersionInfo(1, 1, 1, 1, VersionInfoStage::Alpha, 2);

// - 5.5.5.5 Stable
$versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable);

// Сравниваю
echo "Для начала простое сравнение: ";
$ver1d1 = $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4);
$ver1d2 = $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4);
$ver1d2 = $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1);
echo "$ver1d1|$ver1d2|$ver1d3 \r\n"

echo "Немного перепутаем границы =) ";
$ver2d1 = $versionInfo4->CompareWithRange($versionInfo1, $versionInfo2);
echo "И получим: $ver2d1\r\n";

echo "А теперь с границами!\r\n";
echo "- значение равно левой границе: ";
$ver3d1 = $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1);
echo " $ver3d1\r\n";
echo "- значение равно правой границе: ";
$ver3d2 = $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1);
echo " $ver3d2\r\n";
echo "- а теперь с выключением границ:\r\n";
echo "-- для левой: ";
$ver3d3 = $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder);
echo " $ver3d3\r\n";
echo "-- для правой: ";
$ver3d4 = $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder);
echo " $ver3d4\r\n";
echo "А что если границы равны и значение равно?\r\n";
echo "- для включённых границ: ";
$ver4d1 = $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1);
echo " $ver4d1\r\n";
echo "- для выключённых границ: ";
$ver4d2 = $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1, $optionNotBorder);
echo " $ver4d2";

В результате на экране появится:

Для начала простое сравнение: 0|-1|1
Немного перепутаем границы =) И получим: 1
А теперь с границами!
- значение равно левой границе: 0
- значение равно правой границе: 0
- а теперь с выключением границ:
-- для левой: -1
-- для правой: 1
А что если границы равны и значение равно?
- для включённых границ: 0
- для выключённых границ: -1

Парсинг версий

Для преобразования строки с версией в объект VersionInfo используется статичный метод Parse.

Он требует 1 обязательный параметр и 1 необязательный:

  • string $version - строка с версией (она должна быть в формате #{Major}.#{Minor}.#{Release}.#{Build} #{Stage} #{StageNumber}, причём #{Stage} и #{StageNumber} можно не указывать);
  • array $stagesNames - имена стадий сборки (по умолчанию, StagesNames).

Этот метод возвращает объект {@link VersionInfo} с данными о версии или new VersionInfo(0, 0, 0, 0) в случае ошибки.

Синтаксис:

public static function Parse (string $version, array $stagesNames = self::StagesNames): VersionInfo

Пример,

// Создаю текст
$verText = '1.2.3.4 Beta 2';    

// Преобразую
$version = VersionInfo::Parse($verText);

// Вывожу
echo $version;

В результате на экране появится:

1.2.3.4 Beta 2

Вспомогательные методы

Метод IsNotUndefinedOrStable

Этот статический метод проверяет, является ли версия в неопределённой стадии или уже релизом.

Он имеет только 1 обязательный параметр: VersionInfoStage $versionStage - стадия сборки.

Этот метод возвращает bool: true, если стадия сборки определена и не является релизом и false в противном случае.

Синтаксис:

public static function IsNotUndefinedOrStable (VersionInfoStage $versionStage): bool

Пример,

// Создаю объекты
$version1 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Undefined, 5);
$version2 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Beta, 5);
$version3 = new VersionInfo (1, 2, 3, 4, VersionInfoStage::Stable);

// Сравниваю
$res1 = VersionInfo::IsNotUndefinedOrStabl($version1->Stage);
$res2 = VersionInfo::IsNotUndefinedOrStabl($version2->Stage);
$res3 = VersionInfo::IsNotUndefinedOrStabl($version3->Stage);

// Вывожу
echo $res1 . '|' . $res2 . '|' . $res3;

В результате на экране появится:

false|true|false

Метод MinVersion

Введено в версии 1.0.28.

Этот статический метод без параметров возвращает минимальную версию (объект класса VersionInfo).

Синтаксис:

public static function MinVersion (): VersionInfo

Пример,

// Создаю объекты
$version = VersionInfo::MinVersion();

// Вывожу
echo $version;

В результате на экране появится:

0.0.0.0 PreAlpha 0

Метод MaxVersion

Введено в версии 1.0.28.

Этот статический метод без параметров возвращает максимальную версию (объект класса VersionInfo).

Синтаксис:

public static function MaxVersion (): VersionInfo

Пример,

// Создаю объекты
$version = VersionInfo::MaxVersion();

// В этом примере считается, что константа PHP_INT_MAX равна 9223372036854775807

// Вывожу
echo $version;

В результате на экране появится:

9223372036854775807.9223372036854775807.9223372036854775807.9223372036854775807