These don't really need explicit tests in most cases, but rather static
analysis (currently happening via docblocks). Static analysis tools like
vimeo/psalm already pick this up.

I'd even be happy to get type hints that only have effect on
`ReflectionProperty#getType()` as a massive improvement over the current
situation we've monkey-patched us into, but the patch is indeed consistent
with PHP's current state.


On Mon, 16 Jul 2018, 15:24 Rowan Collins, <rowan.coll...@gmail.com> wrote:

> On 16 July 2018 13:00:57 BST, Dan Ackroyd <dan...@basereality.com> wrote:
> >On 16 July 2018 at 09:43, Rowan Collins <rowan.coll...@gmail.com>
> >wrote:
> >
> >> There's no contradiction here; throwing an error when a
> >> property is *read* is not the same as enforcing that it always has a
> >valid value.
> >
> >That's true, but claiming the RFC just 'trusts' the users to
> >initialise them is a miss-representation of the RFC to me. The RFC
> >catches the mistake if the programmer fails to initialise the variable
> >then reads from it.
>
> Perhaps a better wording is that it requires one user to trust another
> user: the mistake that leads to an unitialized property is the
> responsibility of the author of the class, but the error only appears when
> the object is used, which could be in a completely different library.
>
>
>
> >> If not, the object created would not be fully initialised,
> >
> >This is always going to be the case, unless you're proposing to
> >deprecate ReflectionClass::newInstanceWithoutConstructor .... which is
> >going to break a huge number of applications.
>
> It only needs to be banned (or modified) *for classes which claim their
> properties are non-nullable*. Or, don't introduce non-nullable properties,
> because they can't actually be enforced.
>
>
>
> > For me
> >it is the equivalent of this:
> >
> >function foo() : int {
> >   return "five";
> >}
> >
> >This gives an error when the code is run, not when the code is
> >compiled
>
> It's not about run-time versus compile-time, it's about when the error is
> raised. In this case, it's raised when the return statement is executed.
> The equivalent to the proposed behaviour would be this:
>
> function foo() : int {
>    return "five";
> }
> $foo = foo(); // runs OK, but marks the variable as invalid
> // ... Many lines of code later
> // $foo has not been touched so should be an integer
> $bar = $foo + 1; // Error! Sorry, somebody messed up a return value
> somewhere, it's now up to you to figure out where
>
>
>
> >That would only be a problem in production if you don't run that code
> >at all in development or in test....
>
> If you are going to write tests to see if all your variables are being
> initialized correctly, then you don't need non-nullable type hints, you can
> just assertNotNull on each property.
>
> But again, the user writing those tests is not the user relying on them.
> You are asking users of a library to trust that the library has appropriate
> tests.
>
> Regards,
> --
> Rowan Collins
> [IMSoP]

Reply via email to