Hi Marco Pivetta,

> In fact, if reflection were to switch to the actual runtime return types of
> those methods, I don't see a reason why downstream consumers would break
> (stubbing tools, code generators, type checkers, dependency solvers, etc.)

If the published library/application had to support older versions (e.g. php 
7.4),
but the tentative return types contained types/syntaxes that required php 8.0 
(e.g. union types such as `string|false`, new types such as `mixed`/`never`, 
etc,)
then the code generators and type checkers and stubbing tools would need to be 
updated to exclude the new tentative return types much earlier than absolutely 
needed.

- Users would benefit from code/tooling working the same way in php 7.x and 8.1 
when upgrading to 8.1
  and making the tooling unexpectedly stricter may be regarded as a breaking 
change by end users, especially for unmaintained tools/libraries.

  I'd prefer if the tooling authors and end users had to opt in to use the 
tentative return types
  and upgrade to a version of tooling that was aware of the tentative return 
types to start using them.
- Forcing getReturnType to change immediately would be a barrier to upgrading, 
especially for users that aren't deeply familiar with php, 
  if the php version or library versions being used in production weren't 
compatible with the latest versions 
  of those stubbing tools, code generators, type checkers, dependency solvers, 
etc. that were aware of tentative return types
  (e.g. a test mock no longer returning null)

  To upgrade from php 7.3 (or older) to 8.1, a user may want applications and 
libraries that worked the same way in both 7.3 and 8.1,
  and would only want to upgrade the applications/libraries (and fix the 
tentative type notices) after they stopped using php 7
- PHP 8.0 would be only one year older than 8.1 and automatically generating 
more user-defined subclasses with union types
  this early on (e.g. and publishing to packagist) would be inconvenient for 
users still on php 7.

Also, as mentioned by Nikita Popov in https://externals.io/message/113413#114052
**Having a distinction between getReturnType and getTentativeReturnType also 
allows the functionality in this RFC to be extended in the future,
e.g. from a getReturnType of `BaseType` to getTentativeReturnType of `SubType`, 
rather than only being useful when return types are missing**

Additionally, I agree with the points made by Nikita/Máté Kocsis - older 
releases of static analyzers would treat getReturnType as if it was definitely 
the real type,
and falsely treat some type checks as **definitely** redundant/impossible 
rather than **probably** redundant/impossible,
leading users to remove those checks with insufficient 
validation/testing/review, before it's definitely safe/correct to do so.

- third party code in vendor dependencies (and mocks generated for unit tests) 
are typically not analyzed for issues,
  but third party code might override internal classes and make those seemingly 
redundant/impossible checks actually required).
- E.g. if getReturnType were to change instead of adding getTentativeReturnType,
  older releases of `phan` with `--redundant-condition-detection` would falsely 
report that conditions were definitely impossible/redundant when it is still 
possible for subclasses to return different types.

(I'm a maintainer of the static analyzer http://github.com/phan/phan/ and would 
personally prefer the getTentativeReturnType approach,
Marco Pivetta(Ocramius) works on/contributes to various php projects/analyzers 
such as BetterReflection)

Thanks,
-Tyson
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to