tags:

views:

41

answers:

2

I prefer to develop with E_NOTICES turned on, but I often have to write excess, overly verbose, code when working with array indexes. How can I write this code in less code with E_NOTICES enabled.

With notices suppressed

if ($_REQUEST['some_key'] == 'bob')
{
}

Without notices suppressed

if (array_key_exists('some_key', $_REQUEST) && $_REQUEST['some_key'] == 'bob')
{
}
+3  A: 

I generally use isset(), instead of array_key_exists(), for that kind of thing ; which means using something like this :

if (isset($_REQUEST['some_key']) && $_REQUEST['some_key'] == 'bob')
{
}


A couple of differences :

  • isset is a language construct, and not a function -- and its faster (no function call)
  • note that isset will return false if a data is null ; array_key_exists will return true
    • But it's often not a problem, especially when dealing with GET/POST parameters
  • it shorter to write (a couple less characters)
    • and you can use something like if (isset($_REQUEST['a'], $_REQUEST['b'], $_REQUEST['c']), if necessary
Pascal MARTIN
I prefer array_key_exists() because isset() can't tell difference between NULL value and non-existant keys.
ZZ Coder
Thx Pascal for the robust answer. I think I'll stick to using an input/request library that allows for default values to be set on null/empty vars. ie, $w00lsworth = Input::get('the_var', 'default_value_if_not_passed');
John Himmelman
@ZZ Coder: in what situations do you need to be able to tell the difference? I've never needed to do something with a variable that has been explicitly set to null.
DisgruntledGoat
@John : you're welcome :-) ;; of course, you are the one choosing the solution, in the end ;-)
Pascal MARTIN
@John using an abstraction for the Request is much better anyway, as it decouples you from the actual server environment. Can easily mock Requests this way.
Gordon
A: 

The easy way out is to use @ for error suppression:

if (@$_REQUEST['some_key'] == 'bob') {}

However, this can be very slow if you're using it more than once or twice per page load.

Another solution is to assign your unknown by reference (although I'm not 100% sure this will work for superglobals like $_REQUEST):

$some_key =& $_REQUEST['some_key'];
if ($some_key == 'bob') {}

Generally, I just use isset like Pascal said.

DisgruntledGoat
I'd feel queasy looking at my code with @s splattered everywhere. It should be reserved for special use cases, and standout in your code (ie, if you're debugging a mysterious bug as a result of a suppressed message, it will be a pita, but at least it will be easy to find if it stands out in the code)
John Himmelman
Also, silencing the error is about 4 times slower than calling isset()
Kevin Schroeder