vijinho / enums
PHP7 Enum Implementation
Installs: 22 204
Dependents: 0
Suggesters: 0
Security: 0
Stars: 7
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=5.6
This package is not auto-updated.
Last update: 2025-01-17 03:03:51 UTC
README
This is an implementation for ENUM types in PHP7 which lives on github at vijinho/php7-enums. It's a little different from the other implementations I saw which didn't quite fit my needs and it uses quite a bit of PHP7 magic and overloading to achieve the results I wanted.
Quick Start
Real-world example
class Storage extends Enum { protected static $caseSensitive = true; protected static $capitalize = true; protected static $values = [ 'BIT' => 1, 'BYTE' => 8, 'KILOBYTE' => 8 * 1024, 'GIGABYTE' => 8 * 1024 * 1024 * 1024, 'TERABYTE' => 8 * 1024 * 1024 * 1024 * 1024, ]; } // add definition of a megabyte in bits $s = new Storage; $s(['MEGABYTE' => 1024 * Storage::KILOBYTE()]); echo $s; // get definition of 8 bits $name = $s->key(8); echo $name; // BYTE echo $s->GIGABYTE; // 8589934592 echo $s::KILOBYTE(); // 8192 echo $s->value('TERABYTE'); // 8796093022208 echo Storage::value('BYTE'); // 8 echo Storage::BYTE(); // 8
Using Enum without extending it
I do not advise you to do this because we're using static class members.
use vijinho\Enums\Enum; $e = new Enum(); // new empty enum $e([ 'mercedes' => 'luxury', 'ferrari' => 'sports', 'BMW' ]); echo $e; // outputs to JSON serialized string by magic! /* { "mercedes": "luxury", "ferrari": "sports", "BMW": "BMW" } */ $e->add(['BMW' => 'Bob Marley & The Wailers']); // cannot override existing value echo $e->value('BMW'); // BMW $e->capitalize(true); $e->add('Audi'); echo $e; /* { "MERCEDES": "luxury", "FERRARI": "sports", "BMW": "BMW", "AUDI": "Audi" } */ echo $e->MERCEDES; // luxury echo $e->FERRARI(); // sports echo Enum::AUDI(); // Audi // add non-string value (array) echo "Example 17\n"; $e(['trabant' => ['Germany', 'Eastern Europe']]); // get key by non-string echo $e->key(['Germany', 'Eastern Europe']); // trabant
This is how it ought to be used:
use vijinho\Enums\Enum; class Fruits extends Enum { protected static $values = [ 'apple' => 'Apple', 'pear' => 'Pear', 'banana' => 'Banana', 'orange' => 'Orange', 'grapefruit' => 'Grapefruit', 'tomato' => 'Cucumber', ]; }
### Using ENUM statically
// get an enum value by key echo Fruits::apple(); // Apple echo Fruits::APPLE(); // Apple // add a key => value to the enum Fruits::add([ 'STRAWBERRY' => 'Strawberry', 'Avocado' => 'Avocado' ]); // alternative way to fetch a value by key echo Fruits::value('strawberry'); // Strawberry // return the key for a value echo Fruits::key('cucumber'); // tomato // return all fruits print_r(Fruits::values()); /* ( [apple] => Apple [pear] => Pear [banana] => Banana [orange] => Orange [grapefruit] => Grapefruit [tomato] => Cucumber [STRAWBERRY] => Strawberry [Avocado] => Avocado ) */
### Using ENUM as an object
Continuing from above...
$f = new Fruits; $f(['mango']); // add a new fruit - magic! $f(['pineapple' => 'Pineapple']); // add another new fruit $f->add(['potato' => 'Not a fruit']); var_dump($f); // special var_dump magic! object(Fruits)#5 (5) { ["overwrite"]=> bool(false) ["delete"]=> bool(false) ["capitalize"]=> bool(false) ["caseSensitive"]=> bool(false) ["values"]=> array(11) { ["apple"]=> string(5) "Apple" ["pear"]=> string(4) "Pear" ["banana"]=> string(6) "Banana" ["orange"]=> string(6) "Orange" ["grapefruit"]=> string(10) "Grapefruit" ["tomato"]=> string(8) "Cucumber" ["STRAWBERRY"]=> string(10) "Strawberry" ["Avocado"]=> string(7) "Avocado" ["mango"]=> string(5) "mango" ["pineapple"]=> string(9) "Pineapple" ["potato"]=> string(11) "Not a fruit" } }
### Using ENUM as an array directly
Implements PHP ArrayAccess interface
// create a new enum $e
echo "Example 1\n";
$e = new Enum(['apple', 'pear', 'peach']);
// retrieve apple using array access
echo $e['apple']; // apple
// retrieve apple using array access
echo "Example 2\n";
echo isset($e['pear']); // 1
// remove a value
unset($e['pear']);
echo $e;
/*
{
"apple": "apple",
"peach": "peach"
}
*/
More Usage Examples
The class uses static members, so though it can be instantiated with new
there are some caveats detailed in the examples folder:
- Using enums as an object
- Using static enums.
- Strict usage example of strict enums (case-sensitive, capitalized key)
Installation
Add to your composer.json
the following:
"vijinho/enums": "dev-dev-master"
Then composer update
to get it.
then import to the top of your PHP script with:
use \vijinho\Enums\Enum;