Skip to main content
Code Review

Return to Revisions

5 of 5
replaced http://stackoverflow.com/ with https://stackoverflow.com/

By reading the manual:

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.

So in short:

$nid = $_GET['nid'] ?: 0;

Would work, but PHP will trigger a notice if $_GET['nid'] is not set. The logic || operator won't help, either. The closest you can get is:

(($nid = $_GET['nid']) || ($nid = o));

But that's not exactly shorter, nor does it solve the Notice issue.
The "best" as in shortest, moste un-maintainable and horrible looking code I can think of is this:

$nid = 0;//default
foreach($_GET as $name => $val)
{
 $$name = $val;
}
var_dump($nid);

This turns all keys that were present in the $_GET array into var names. If you simply declare the vars you're after (names must be identical to keys, though) and assign them a default value, this loop takes care of the rest.
To map certain keys to another variable name, you could use another array:

$nid = 0;
$map = array('new_id' => 'nid');
foreach($_GET as $k => $v)
{
 if (isset($map[$k]))
 {
 $k = $map[$k];
 }
 $$k = $v;
}

But honestly, maintaining code like this is going to be a nightmare. Though request objects add a lot of overhead for a task as simple as this, their get methods make it all worth while:

public function get($name, $default = null)
{
 if (!isset($_GET[$name]))
 {
 return $default;
 }
 return $_GET[$name];
}

This is easy to read/understand and easy to use:

$nid = $getInstance->get('nid', 0);

Assignes the GET param, or 0 to $nid... which makes your code tidier, easier to maintain and a lot easier to understand. Based on the use-case you posted, I take it you're not using the ternary on just request variables. Well, in that case: use objects with getters/setters that define a default return value (or allow for one to be specified @call-time). If needs must, implement the ArrayAccess or some Traversable interface, so you can use it as an array, too.
Granted, it'll take some time/effort to do this, but once you've done that, any new code you write will be cleaner (no ternaries), debugging will be a doddle and type-hinting will become your best friend. check this answer for some examples and considerations on getters and setters, along with this answer on the importance of pre-declaring properties (and thus implementing getters/setters).

If you're still up for it after that, refer to this answer to see why and how you should avoid object overloading (in PHP, at least) as much as possible.

default

AltStyle によって変換されたページ (->オリジナル) /