Hello Maté,
https://wiki.php.net/rfc/internal_method_return_types) as well as the
> implementation based on the feedback Nikita and Nicolas provided.
Thanks for moving this topic forward, it's very much needed.
I like the word "tentative" you're using to describe the missing return
types.
I would be good with the RFC but I want to give a few different ideas to
challenge it a bit.
Here they are:
- About using "E_STRICT", I'm not really sold. I think these notices
should follow the same path as deprecations as far as reporting is
concerned. By using E_STRICT, many error handlers will throw exceptions,
while the code is fine really. Deprecations don't lead to exceptions
usually (at least they never do in any Symfony stack). Semantically, a
deprecation fits well to me also.
- Suppressing the notice is very much needed, but I think we can merge
the corresponding attribute with the TentativeReturnType that you mention
in "future scope".
- As a corollary, we might not need the new methods on ReflectionMethod:
instead, we might make getAttributes() return a TentativeReturnType
attribute for internal methods too.
To summarize my proposal, I think we need only one TentativeReturnType
attribute, that we would put on internal methods, and that would also be
allowed on userland methods. ReflectionMethod::gettAttributes() would
report these attributes for both internal and userland methods.
The attribute would need to convey the allowed types. This could be done
with a list of strings. Taking your example from the RFC, this would look
like this:
class MyDateTime extends DateTime{
/**
* @return DateTime|false
*/
#[TentativeReturnType(DateTime::class, 'false')] public
function modify(string $modifier) { return false; }}
In this example, this would duplicate the docblock, but many docblocks
contain extended return-type info that the engine doesn't understand
anyway (list of types, etc.)
When engine sees these attributes, it would behave as you describe in
the RFC, with one possible extension: it could also validate the
supplied list of types and check LSP on it (when there is a parent
type).
Does this make sense to you?
Nicolas