Hello internals,

I would like to propose a new type of backed enum: flag. This is an 
integer-backed enum that requires power-of-two values that can be combined with 
the bitwise operators to be used as flags.

In some core functions, it might look like this:

enum JSON_FLAG: flag {
  case None = 0;
  case ThrowOnError = 0x1 << 1;
  // etc.
  case PrettyPrint = 0x01 << 4;
  // etc.
}

function json_decode(string $data, bool $assoc = false, int $depth = 512, 
JSON_FLAG|int $options = JSON_FLAG::None) {}

json_decode($data, options: JSON_FLAG::ThrowOnError | JSON_FLAG::PrettyPrint);

Note that the goal here isn’t so much to save typing space, as it is to provide 
easier discoverability through IDEs, better type safety, and better ergonomics 
in the language overall.

Attempting to use a backed value that is not a power-of-two would result in a 
compilation error. Bitwise operations are performed as though they’re performed 
on a regular integer.

What do you think?

I couldn’t find any similar proposals (listed on the RFC page) before proposing 
this on the list, so if you’re working on this, please speak up; I’d like to 
join forces.

— Rob

Reply via email to