Hi there,

In the "Implict isset in ternary operator" thread, the idea of a special version of the ternary operator with an isset implied was proposed. I don't like this idea very much, but from that I want to suggest some sort of "default" operator.

On IRC I had a little discussion about it with nikic (Nikita), salathe (IRC realname is Peter) and Tyrael (Ferenc).

Basically, I end up writing code like this a lot:

  if (!isset($relations[$prev])) {
      $relations[$prev] = [];
  }

I don't like isset(), it looks quite ugly to me (although I'm fine with empty()). And I think a non-keyword operator for it would be more readable, and save space.

My basic idea is summed up by salathe here: https://gist.github.com/3256826

An operator (let's use ? for the time being, whether that becomes the actual operator or not) is proposed that functions like isset, so:

  $var? // same as isset(var)

This on its own is already shorter than isset(), and imo, nicer to read:

  if ($var?) { /* ... */ }

However, I also propose a variant on the "var ?" form, which is "var ? default", for specifying a default:

  $var ? "default" // same as isset($var) ? $var : "default"

This would allow you to express this:

  if (!isset($_REQUEST['p'])) {
      $page = 'home';
  } else {
      $page = $_REQUEST['p'];
  }

More concisely as:

  $page = $_REQUEST['p'] ? 'home';

But I also propose something like a ?= operator, such that you can fill in defaults where a variable doesn't exist:

  $array['thing'] ?= "default value";

So, to some up:

|   $var ?           => isset($var)
  $var ? default   => isset($var) ? $var : default
  $var ?= default  => $var = $var ? default => $var = isset($var) ? $var : 
default|

Thoughts? This is all hypothetical, of course. It is probably not difficult to implement, but I think it needs discussing before implementing, I am not going to rush.

Thanks.

--
Andrew Faulds
http://ajf.me/


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to