On Wed, Mar 10, 2021, at 12:06 PM, Matthew Brown wrote:
> Hey,
>
> Ondřej Mirtes and I present an RFC for the noreturn type:
> https://wiki.php.net/rfc/noreturn_type
>
> The feature already exists in Hack (the primary inspiration) and is
> currently supported by our static analysis tools inside docblocks, and we
> feel there's a good argument for it to be supported by PHP itself.
>
> Thanks,
>
> Matt & Ondřej
My main concern is around the covariance of inheritance. The example given:
abstract class Person
{
abstract public function hasAgreedToTerms(): bool;
}
class Kid extends Person
{
public function hasAgreedToTerms(): noreturn
{
throw new \Exception('Kids cannot legally agree to terms');
}
}
While that may be technically correct from a type theory perspective (my type
theory isn't strong enough to say either way), I don't feel like that obeys
Liskov. If I have an array of Person objects, and I iterate them to check if
they've all agreed to terms, I expect the return value to be a *usable* type in
the Person interface or a subtype of it *that I can still use*. I cannot use
Kid's return type, because it's by definition non-existent.
That feels like a bad time bomb.
Other than that concern, I'm fine with the spec. I would marginally prefer
"never" over "noreturn", but not enough to vote against it just for that.
--Larry Garfield
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php