Hi Andrey,

> On 2 Feb 2015, at 16:57, Andrey Andreev <n...@devilix.net> wrote:
> 
> On Mon, Feb 2, 2015 at 6:52 PM, Andrea Faulds <a...@ajf.me> wrote:
>> Hi Andrey,
>> 
>>> On 2 Feb 2015, at 16:48, Andrey Andreev <n...@devilix.net> wrote:
>>> 
>>> As already said, we're just going around in circles at this point, but
>>> a migration issue?
>>> 
>>> Whatever code using the scalar type hints should be *new* code in
>>> userland.
>> 
>> Why not existing userland code? If only new code adds type hints, the 
>> ability to detect errors in code is severely curtailed. That would be really 
>> unfortunate.
>> 
>>> You're basing your whole argument on the assumption that all
>>> internal functions would break with strict=1 ... nobody needs that and
>>> it doesn't have to be done.
>> 
>> I wasn’t talking about internal functions… I’m talking about userland code 
>> in the hypothetical case that we added strict-only hints.
>> 
>> I don’t see where you’ve gotten that impression from.
>> 
> 
> Well ... existing userland code doesn't have scalar type hints, it
> couldn't possibly do. How can you have migration issues with it?

I’ll just quote my previous message:

> One of the nice things about strict mode only applying to code which asks for 
> it, is that if a function if an API has type hints added, it won’t suddenly 
> break calling code that didn’t strictly match types, if that calling code 
> uses the default weak mode behaviour (which it will if it was written pre-PHP 
> 7).
> 
> For example, say I have some sort of Response object that lets you set a body:
> 
>    class Response {
>        public function setBody($message);
>    }
> 
> In PHP 5, it’s perfectly fine to pass something that’s not a string for 
> $message:
> 
>    $foo = new Response;
>    $foo->setBody(67);
> 
> Absurd example, but this sort of thing does happen in real world code, often 
> accidentally.
> 
> Now, let’s say we add a string type hint in a new version of the library:
> 
>    interface Response {
>        public function setBody(string $message);
>    }
> 
> If PHP’s type hints were always strict, then our existing PHP 5 code from 
> earlier that took advantage of PHP’s weak typing would now produce an error:
> 
>    Catchable fatal error: Argument 1 passed to Response::setBody() must be of 
> the type string, integer given
> 
> This isn’t good - it makes migration of the existing codebase difficult.
> 
> Weak typing solves this problem because it allows conversions. However, it’s 
> not really good that the code was passing an integer in the first place - it 
> should really be passing a string.
> 
> The solution, then, is what this RFC offers. By default, weak typing is used, 
> so your existing code doesn’t break initially. But once you’ve added type 
> hints in a few places, you can switch to strict typing, and that error will 
> be detected and can be fixed.
> 
> This way, we can have stricter types without sacrificing compatibility or 
> complicating migration.


Basically, strict-only types complicates their addition to existing codebases, 
including libraries.

What this RFC proposes is similar to Hack’s gradual typing, in a sense, in that 
it allows you to gradually add types to your codebase without breaking things.

--
Andrea Faulds
http://ajf.me/





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

Reply via email to