Re: Add E_STRICT when defining a required function parameter after an optional parameter
| From: | John Bafford | Date: | Thu, 25 Nov 2010 02:05:57 +0000 |
| Subject: | Re: Add E_STRICT when defining a required function parameter after an optional parameter | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-50487@lists.php.net to get a copy of this message | ||
On Nov 24, 2010, at 14:02, Stas Malyshev wrote:
>> Given the semantics of PHP arguments, there is "nothing wrong" with
>> defining a required argument after an optional one, and in some cases
>> it is required. Consider:
>
> I think there's something wrong with it, primarily - the fact that it doesn't really
> make any sense. The object/null thing is a kludge. Unfortunately, I don't see a proper way to
> handle this without named arguments.
Ok, I re-wrote the patch and test:
http://bugs.php.net/patch-display.php?bug_id=53399&patch=strict-required-opt2.patch&revision=latest
Now, the test happens in zend_do_end_function_declaration(). It loops through each of the
function's parameters and emits the E_STRICT if it detects a required parameter after an
optional parameter. The tests are loosened so that Class $param = null will not by itself trigger
the warning. So it's not a 100% solution since we have to allow for the object/null kludge, but
it's still an improvement from not having anything at all.
To make this work, I added a field to zend_arg_info, 'optional', which is populated in
zend_do_receive_arg(). Also, we might want to modify php_reflection.c:_parameter_string() to use
zend_arg_info.optional, which would allow indicating whether the parameter was declared optional vs.
whether it actually is being treated as optional.
I think I can move the implementation back into zend_do_receive_arg(), but before I go ahead and do
that, I'd like to make sure everyone's happier with this solution than my first. It might
also be possible to get rid of zend_arg_info.optional, but I'd need to know how/if it's
possible to access the relevant oplines for the rest of the function's parameters.
-John
--
John Bafford
http://bafford.com/