On 03.04.21 18:30, Benjamin Eberlei wrote:
if (is_string($value) && is_int($value)) { // inside here $value is_type == "never" }The naming "never" here makes no sense, because from a theoretical perspective reasoning about the type of $value it is nothing and only the block of code is "never reached". I suppose PHPStan and Psalm are eager to reuse the new type name for this kind of type interference, same as TypeScript does. The name is sub optiomal outside the context of a return type.
I read through all the Typescript and Hack explanations/examples of "never" and "nothing", and to me "never" seems clearer, which just shows how different opinions can be. I would not like "nothing" because it seems so similar to "void" and "null". "This function returns nothing" would inevitably lead to the question what that actually means. "This function returns never" is a reasonably clear description. "This variable at this point is never" or "This variable at this point is nothing" are both not clear without context, although never implies this should not happen (or cannot happen) and could be interpreted as "This variable at this point is never anything", which in general would be clearer to me (not being familiar with either before this proposal). From a practical perspective, I think the proposal is about the return type because this has a clear use case in code today. Your $value example would lead to the Psalm/PHPStan errors of "Type does not contain type" (Psalm) or "Result of && is always false" (PHPStan), I don't think there currently is much use to determine a type of never in these cases. But that might be something Matt/Ondrej can answer a lot better than me. I initially preferred "noreturn", but now prefer "never". "noreturn" is more self-explanatory, but "never" seems more apt and versatile, while still being quite clear. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php
