baseVersion = $baseVersion; $this->development = $isDevBuild; $this->build = $buildNumber; preg_match('/^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$/', $this->baseVersion, $matches); if(count($matches) < 4){ throw new \InvalidArgumentException("Invalid base version \"$baseVersion\", should contain at least 3 version digits"); } $this->major = (int) $matches[1]; $this->minor = (int) $matches[2]; $this->patch = (int) $matches[3]; $this->suffix = $matches[4] ?? ""; } public static function isValidBaseVersion(string $baseVersion) : bool{ return preg_match('/^\d+\.\d+\.\d+(?:-(.*))?$/', $baseVersion, $matches) === 1; } public function getNumber() : int{ return (($this->major * 1_000_000) + ($this->minor * 1_000) + $this->patch); } public function getBaseVersion() : string{ return $this->baseVersion; } public function getFullVersion(bool $build = false) : string{ $retval = $this->baseVersion; if($this->development){ $retval .= "+dev"; if($build && $this->build > 0){ $retval .= "." . $this->build; } } return $retval; } public function getMajor() : int{ return $this->major; } public function getMinor() : int{ return $this->minor; } public function getPatch() : int{ return $this->patch; } public function getSuffix() : string{ return $this->suffix; } public function getBuild() : int{ return $this->build; } public function isDev() : bool{ return $this->development; } public function __toString() : string{ return $this->getFullVersion(); } public function compare(VersionString $target, bool $diff = false) : int{ $number = $this->getNumber(); $tNumber = $target->getNumber(); if($diff){ return $tNumber - $number; } if(($result = $tNumber <=> $number) !== 0){ return $result; } if($target->isDev() !== $this->isDev()){ return $this->isDev() ? 1 : -1; //Dev builds of the same version are always considered older than a release } if(($target->getSuffix() === "") !== ($this->suffix === "")){ return $this->suffix !== "" ? 1 : -1; //alpha/beta/whatever releases are always considered older than a non-suffixed version } return $target->getBuild() <=> $this->getBuild(); } }