On Mon, Feb 2, 2015 at 7:00 PM, Andrea Faulds <a...@ajf.me> wrote:
> 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.
>

Eh ... sorry for not mentioning that in the same mail, but I've never
suggested a strict-only approach.

Cheers,
Andrey.

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

Reply via email to