Php function argument error suppression, empty() isset() emulation

后端 未结 14 525
执笔经年
执笔经年 2021-01-11 17:32

I\'m pretty sure the answer to this question is no, but in case there\'s some PHP guru

is it possible to write a function in a way where invalid arguments or non exi

相关标签:
14条回答
  • 2021-01-11 18:05

    With a single line, you can acomplish it: myHappyFunction($someBogusVar="");

    I hope this is what you are looking for. If you read the php documentation, under default argument values, you can see that assigning a default value to an function's argument helps you prevent an error message when using functions.

    In this example you can see the difference of using a default argument and it's advantages:

    PHP code:

    <?php
    function test1($argument)
    {
        echo $argument;
        echo "\n";
    }
    
    function test2($argument="")
    {
        echo $argument;
        echo "\n";
    }
    
    test1();
    test1("Hello");
    test1($argument);
    $argument = "Hello world";
    test1($argument);
    
    test2();
    test2("Hello");
    test2($argument);
    $argument = "Hello world";
    test2($argument);
    ?>
    

    Output for test1() lines:

    Warning: Missing argument 1 for test1() .
    Hello.
    .
    Hello world.

    Output for test2() lines:

    .
    Hello.

    Hello world.

    This can also be used in combination to isset() and other functions to accomplish what you want.

    0 讨论(0)
  • 2021-01-11 18:06

    I'm sure there could be a great discussion on ternary operators vrs function calls. But the point of this question was to see if we can create a function that won't throw an error if a non existent value is passed in without using the '@'

    0 讨论(0)
  • 2021-01-11 18:07

    @Brian: I use a trinary operation to do the check for me:

    return $value ? $value : $default;
    

    this returns either $value OR $default. Depending upon the value of $value. If it is 0, false, empty or anything similar the value in $default will be returned.

    I'm more going for the challenge to emulate functions like empty() and isset()

    0 讨论(0)
  • 2021-01-11 18:09

    No, because this isn't really anything to do with the function; the error is coming from attempting to de-reference a non-existent array key. You can change the warning level of your PHP setup to surpress these errors, but you're better off just not doing this.

    Having said that, you could do something like

    function safeLookup($array, $key)
    {
      if (isset($array, $key))
        return $array[$key];
    
      return 0;
    }
    

    And use it in place of array key lookup

    defaultValue(safeLookup($foo, "bar"), "baz);
    

    Now I need to take a shower :)

    0 讨论(0)
  • 2021-01-11 18:14

    is it possible to write a function in a way where invalid arguments or non existent variables can be passed in and php will not error without the use of '@'

    Yes you can!

    porneL is correct [edit:I don't have enough points to link to his answer or vote it up, but it's on this page]

    He is also correct when he cautions "But I recommend against abusing this for hiding programming errors." however error suppression via the Error Control Operator (@) should also be avoided for this same reason.

    I'm new to Stack Overflow, but I hope it's not common for an incorrect answer to be ranked the highest on a page while the correct answer receives no votes. :(

    0 讨论(0)
  • 2021-01-11 18:15

    And going further up the abstraction tree, what are you using this for?

    You could either initialize those values in each class as appropriate or create a specific class containing all the default values and attributes, like:

    class Configuration {
    
        private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                           'uncool' => 'Defuncoolval'  );
    
        public setCool($val) {
            $this->configValues['cool'] = $val;
        }
    
        public getCool() {
            return $this->configValues['cool'];
        }
    
    }
    

    The idea being that, when using defaultValue function everywhere up and down in your code, it will become a maintenance nightmare whenever you have to change a value, looking for all the places where you've put a defaultValue call. And it'll also probably lead you to repeat yourself, violating DRY.

    Whereas this is a single place to store all those default values. You might be tempted to avoid creating those setters and getters, but they also help in maintenance, in case it becomse pertinent to do some modification of outputs or validation of inputs.

    0 讨论(0)
提交回复
热议问题