Edit report at https://bugs.php.net/bug.php?id=60568&edit=1

 ID:                 60568
 User updated by:    dan dot lugg at gmail dot com
 Reported by:        dan dot lugg at gmail dot com
 Summary:            String arguments for func_get_arg() as well as
                     func_has_arg()
 Status:             Open
 Type:               Feature/Change Request
 Package:            Reflection related
 Operating System:   Not Relevant
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

To expand on the func_has_arg() functionality -- As in the case of 
func_get_arg(), 
func_has_arg() should return FALSE for non-supplied arguments, regardless of 
any 
default values:

    function test($foo, $bar = null){
        var_dump(func_has_arg(0));
        var_dump(func_has_arg('foo'));
        var_dump(func_has_arg(1));
        var_dump(func_has_arg('bar'));
    }

    test('hello');
    // bool(true)
    // bool(true)
    // bool(false)
    // bool(false)


Previous Comments:
------------------------------------------------------------------------
[2011-12-20 03:37:46] dan dot lugg at gmail dot com

Description:
------------
The following are my proposals:

func_get_arg($arg_num) should support string arguments. A given string argument 
should correspond to the parameter name:

    function test($foo){
        var_dump(func_get_arg(0));
        var_dump(func_get_arg('foo'));
    }

    test('hello');
    // string(5) "hello"
    // string(5) "hello"

As well, an additional function should be added; func_has_arg($arg_num_or_name) 
which will *not* throw warnings when an out-of-bounds argument is passed. It 
should accept the same argument types of int|string as func_get_arg()

    function test($foo){
        var_dump(func_has_arg(0));
        var_dump(func_has_arg('foo'));
        var_dump(func_has_arg(1));
        var_dump(func_has_arg('bar'));
    }

    test('hello');
    // bool(true)
    // bool(true)
    // bool(false)
    // bool(false)

I find that without this functionality, it is very difficult to determine 
whether or not an argument has in fact been passed in some circumstances. This 
issue was brought to light when I was attempting to test for an optional 
argument intended to be passed by reference.

Like the preg_* family of functions, the optional parameter by reference would 
be populated with values under certain conditions of the function call. The 
parameter was declared with a default value of NULL. The issue is, when passing 
a previously undefined variable as an argument to this function, it has the 
inherent value of NULL, making is_null($arg) fail.

One may consider unconditionally populating the variable with results, however 
if the process to generate these results is expensive, then there would be a 
clear advantage to testing whether the client-code has explicitly requested the 
results before proceeding with the necessary process.

My colleagues and I have determined that some solutions may include:

 - Adding an additional boolean flag argument to a given function, and proceed 
with populating the referenced variable on a TRUE condition.
 - Checking instead, the number of arguments passed with func_num_args().
 - Generating some arbitrary value with low possibility of collision, defining 
it as a constant, and using that as a default. 

Unfortunately, these solutions are mere work-arounds. The additional boolean 
flag lengthens the parameter list unnecessarily. Checking the number of passed 
arguments couples the check to the parameter count. The arbitrary default value 
is fraught with issues from collision to maintenance and overhead.

These issues would be mitigated by supporting string arguments to 
func_get_arg() 
and the proposed func_has_arg(), by decoupling the functions from parameter 
count/order through the support for named parameter queries, as well as 
allowing 
for a genuine check of whether an argument was in fact passed (regardless of 
value, default or not).



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=60568&edit=1

Reply via email to