/** * Parse a string into Versionable properties * * @throws InvalidArgumentException * * @param string $string * @return Version **/ public static function fromString($string) { // Sanity check if (substr_count($string, '.') !== 2) { throw new InvalidArgumentException('Version "' . $string . '" can not be parsed into a valid SemVer major.minor.patch version'); } $parts = explode('.', $string); $versionable = new self(); // Extra check if (!is_numeric($parts[0]) || (int) $parts[0] < 0 || !is_numeric($parts[1]) || (int) $parts[1] < 0 || !is_numeric($parts[2]) || (int) $parts[2] < 0) { throw new InvalidArgumentException('Version "' . $string . '" can not be parsed into a valid SemVer major.minor.patch version'); } // Versionable parts $versionable->setMajor((int) $parts[0])->setMinor((int) $parts[1])->setPatch((int) $parts[2])->setOriginalVersionString($string); return $versionable; }