void means the function returns nothing and never means it does not return, and the second is information a static analyser can act on.
function fail(string $message): never
{
throw new DomainException($message);
}
$status = OrderStatus::tryFrom($input) ?? fail('unknown status');
// the analyser knows $status is not null here, because
// fail() cannot have returned.
// legal bodies for a never function: throw, exit, an
// infinite loop. a `return;` is a fatal error.
The practical value is at the end of a null-coalescing chain and in a match arm, where a helper that always throws previously left the analyser assuming the function could return null. never is covariant, so an overriding method may narrow void to it and not the reverse. It is also a genuine documentation improvement — a method typed never says loudly that calling it ends the current path.