ES6 supports the Symbol type that is a replacement to hard-coded
identifiers where it are not really need.

I like to suggests a similar feature to PHP.

#0: it should be a partial class that could not be instantiated (new symbol
should be invalid, like an abstract class).

In this point I should suggests two options:

1. It should works like a new keyword "symbol", but that could be extended
like a class when need. (It will make sense on item #2). But could be
referenced directly without need of the ::class. (eg. $a = symbol;).

2. Other option is use it as a new keyword "symbol" followed by a \Symbol
reference class (like "instanceof Class" works). Eg. $a = symbol \Symbol;
Anyway, maybe \Symbol could works as a default type, so only $a = symbol
could be do the job. Or even consider symbol as a language constructor,
allowing symbol(\Symbol), for instance.

Ok, now to all make senses (I do expects), keep reading... (I will use
otpion 2 as reference for now)

#1: It could be used to fill constants, for instance, with "magic
identifiers" that have no real value, needly.

Eg.:

public const
    USER_NOT_FOUND = symbol(),
    USER_INVALID = symbol();

Where USER_NOT_FOUND !=/!== USER_INVALID.

#2: Another possibility is to extends it as an class, so it could be used
as parameter typehint: (not available on ES6, I guess)

class UserErrorSymbol extends \Symbol {}

public const
    USER_NOT_FOUND = symbol(UserErrorSymbol),
    USER_INVALID = symbol(UserErrorSymbol);

public function setError(UserErrorSymbol $error) {...}

#3: it should have a fallback name (storing a scalar value), so in case you
need to persist it (or serialize), so you could give a name:

public const
    USER_NOT_FOUND = symbol(UserErrorSymbol as "UserNotFound"),
    USER_INVALID = symbol(UserErrorSymbol as "UserInvalid"),
    USER_INVALID_B = symbol(UserErrorSymbol as "UserInvalid");

symbol_alias(USER_INVALID) === 'UserInvalid'
(string) USER_INVALID === 'UserInvalid'
USER_INVALID !=/!== USER_INVALID_B

#4: it could be used as a kind of anonymous array or object key:

$arr[symbol()] = 1;
$arr[symbol()] = 2;
count($arr) === 2

$obj->{symbol()} = 1;
$obj->{symbol()} = 2;
count(get_object_vars($obj)) === 2

But symbol could not be accessed without a valid reference:

echo $arr[symbol()]; // error: index symbol() is undefined or maybe symbol
type could not be used directly to read an array value

$symbol = symbol();
$arr[$symbol] = 1;
echo $arr[$symbol]; // print 1

It is just a draft, but I do belive that it will be a good feature for PHP.

Reply via email to