On Wed, Sep 21, 2016 at 10:34 AM, Nicolas Grekas <nicolas.gre...@gmail.com> wrote:
> > >> I'm not so sure its a BC though. Technically nullable types don't exist >> in 7.0 and as such would be impossible to return said question mark. Its >> only adding support for a new feature, not changing how an existing feature >> works IMO. If nullable types had been in 7.0 its highly probably, that >> __toString would have returned the leading question mark back then. >> > > Here is the BC break: https://3v4l.org/VUbIS > > As light as it looks to be, the output on PHP7.1RC2 is not the same as in > PHP7.0. > Yet, __toString() is the only public interface that is available on PHP > 7.0, > so people have already built things on top. > > I get that the output changed, but so did the type definition with the new feature. However, I feel this is a problem with the way types are inferred. To me Type $foo = null is an entirely different definition than ?Type $foo, but that's not how its implemented in the language. To me Type $foo = null should say "I have a parameter that is not required, but when its passed it needs to be an instance of Type", whereas ?Type $foo should say "I require this parameter, and it needs to be an instance of Type or null". If these definition were the result of those expressions, then we could have a third state, namely ?Type $foo = null which would say "I do not require this parameter, but when its passed it needs to be an instance of Type or null". I think the reason it works this way is, get this, for BC since previously Type $foo = null was the only way to make a parameter nullable, while having the intentional or unintentional side effect of making it optional (or the only way to make it optional, while having the side effect of making it nullable). However, given the current workings, Type $foo = null IS in fact nullable, therefore the string representation of that type is in fact ?Type. To handle this in code written around current __toString seems pretty simple: $type = method_exists($RefType, 'getName') ? $RefType->getName() : (string) $RefType; Given how simple that is, I'm not understanding what makes it such a big deal for you (or anyone else) either? > > Nicolas > p.s. to Nikita: my bad for the too short quote... >