On 1 September 2014 17:18, Andrea Faulds <a...@ajf.me> wrote:
>
> On 1 Sep 2014, at 04:56, Xinchen Hui <larue...@php.net> wrote:
>
>> On Mon, Sep 1, 2014 at 6:01 AM, Andrea Faulds <a...@ajf.me> wrote:
>>> Good evening,
>>>
>>> Here’s a suggestion: Why don’t we make zend_parse_parameters emit
>>
>> ""Why not" is usually not a very good reason for a change in the language
>> syntax. " — Stas
>
> The reason isn’t “why not”, the reason is to improve consistency and make 
> programs safer. This makes zpp consistent with userland type hints (less user 
> confusion), and also means programs can failsafe rather than trundle on and 
> do something stupid.
>
>>> E_RECOVERABLE_ERROR on failure, rather than just emitting E_WARNING and
>>> returning FAILURE (causing the caller to typically bail out and return 
>>> NULL)?
>>> This would bring it into line with userland type hints, which also cause 
>>> such
>>> errors. It might also cause errors to be caught sooner, as just returning 
>>> NULL
>>> can cause cryptic problems down the line. It’s worth noting that
>>> zend_parse_parameters is very tolerant in terms of what parameters you can 
>>> pass
>>> it and is unlikely to error unless you do something really weird such as
>>> passing an array to strlen().
>> PHP is a looser type language... such things might be happened. and
>> internal functions always check their arguments.
>
> Certain types of type shift are uncommon. zpp is extremely tolerant, as it 
> should be in a weakly-typed language, so all of these would work:
>
>     takes_int(1);
>     takes_int(1.0);
>     takes_int(“     123abc.7”);
>     takes_int(new StdClass);
>     takes_int(true);
>
> It’s only in quite rare cases that zpp will actually fail and emit an error, 
> and in these cases you probably don’t want your application to keep going. In 
> the event you did, you could always make your error handler skip these 
> errors. If nikic’s exceptions in the engine RFC is revived, you could even do 
> this:
>
>     try {
>         takes_int($something);
>     } catch (InvalidArgumentException $e) {
>         // Handle gracefully
>     }
>
> Which would be more robust than checking for === NULL, as some functions 
> return NULL for other reasons and this won’t spit out an E_WARNING.

It's also worth noting that the "return NULL on zpp failure"
convention is not followed to the letter, I have seen places that
RETURN_FALSE - I can't remember exactly where I have seen this but I
will dig a ref out if anyone wants it.

> To help BC, we could even make it do the old thing if @ is being used to 
> silence it.

Don't like this

>> this will make the PHP app more robust.
>
> I think applications are more robust if they fail early rather than plodding 
> along because the programmer forgot an error check, and hence corrupting data 
> or worse.

+1

>>> I doubt this would affect backwards compatibility
>>> much, unless your application relies on a silenced warning (which is 
>>> possible,
>>> but discouraged behaviour), and it’s the type of BC break that would be 
>>> really
>>> obvious (your application errors and stops execution).
>> that will be a nightmare to stop people upgrade their PHP.
>
> I doubt it. It’s not something you’re likely to be relying on (it’s a failure 
> case), and if it is, you can use an error handler to skip the error and get 
> your old behaviour.
>
> Thanks.
> --
> Andrea Faulds
> http://ajf.me/

I'm roughly -0.5 on this proposal overall. I'd like this to be easily
handleable in userland, but I don't like E_RECOVERABLE_ERROR (in
general, not just here). I'd very much support this if it used
exceptions, though.

Thanks, Chris

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

Reply via email to