Slide 1

Slide 1 text

Tommy Mühle | tommy-muehle.io Enums An introduction 1

Slide 2

Slide 2 text

Tommy Mühle | tommy-muehle.io Tommy Mühle
 Software Engineer and Author 2

Slide 3

Slide 3 text

Tommy Mühle | tommy-muehle.io What is an enum? 3

Slide 4

Slide 4 text

Tommy Mühle | tommy-muehle.io Tommy Mühle | tommy-muehle.io … a data type consisting of a set of named values called elements … of the type. 
 The enumerator names are usually identifiers that behave as constants in the language. https:/ /en.wikipedia.org/wiki/Enumerated_type

Slide 5

Slide 5 text

Tommy Mühle | tommy-muehle.io How they are implemented in PHP? 5

Slide 6

Slide 6 text

Tommy Mühle | tommy-muehle.io There is no native implementation 6

Slide 7

Slide 7 text

Tommy Mühle | tommy-muehle.io 7 https:/ /wiki.php.net/rfc/enum

Slide 8

Slide 8 text

Tommy Mühle | tommy-muehle.io 8 https:/ /docs.hhvm.com/hack/enums/introduction

Slide 9

Slide 9 text

Tommy Mühle | tommy-muehle.io Without enum classes 9

Slide 10

Slide 10 text

Tommy Mühle | tommy-muehle.io 10 Avoid global constants // app.php const STATE_ACTIVE = 'active'; const STATE_COMPLETED = 'completed'; $app = new Application(); $app->setState(STATE_ACTIVE); // ... return $app->run();

Slide 11

Slide 11 text

Tommy Mühle | tommy-muehle.io 11 class StateHandler { const STATE_ACTIVE = 'active'; const STATE_CANCELED = 'canceled'; public function handle($state) { if ($state !== self::STATE_ACTIVE) { // ... } // ... } } Avoid class constants

Slide 12

Slide 12 text

Tommy Mühle | tommy-muehle.io With enum classes 12

Slide 13

Slide 13 text

Tommy Mühle | tommy-muehle.io 13 final class Color { const __DEFAULT = 'black'; const RED = 'red'; private $value; public function __construct(string $color = null) { $this->value = $color ?? self::__DEFAULT; } public function __toString() { return $this->value; } }

Slide 14

Slide 14 text

Tommy Mühle | tommy-muehle.io Advantages 14

Slide 15

Slide 15 text

Tommy Mühle | tommy-muehle.io You can get a list of all the values 15

Slide 16

Slide 16 text

Tommy Mühle | tommy-muehle.io 16 final class Color { // ... public function __construct(string $color = null) { $value = $color ?? self::__DEFAULT; if (!in_array($value, $this->all(), true)) { // ... } $this->value = $value; } public function all() : array { return (new \ReflectionClass(static::class))
 ->getConstants(); } // ... }

Slide 17

Slide 17 text

Tommy Mühle | tommy-muehle.io You can type-hint 17

Slide 18

Slide 18 text

Tommy Mühle | tommy-muehle.io 18 class Article { private $color; public function colorize(Color $color) { // ... } }

Slide 19

Slide 19 text

Tommy Mühle | tommy-muehle.io You can enrich your classes with methods. 19

Slide 20

Slide 20 text

Tommy Mühle | tommy-muehle.io 20 final class Color { // ... protected $value; // ... public function value() { return $this->value; } public function equals(Color $color) { // or any other business condition return $this->value === $color->value(); } }

Slide 21

Slide 21 text

Tommy Mühle | tommy-muehle.io 21 final class Color { // ... protected $value; // ... public static function fromHex(string $hex) { // do something with $hex and get $color return new self($color); } public function format() { return 'My special color format'; } }

Slide 22

Slide 22 text

Tommy Mühle | tommy-muehle.io You can extend this classes 22

Slide 23

Slide 23 text

Tommy Mühle | tommy-muehle.io 23 // if class Color are not final final class SpecialColor extends Color { // add further values, enrich methods, etc. }

Slide 24

Slide 24 text

Tommy Mühle | tommy-muehle.io Before you start 24

Slide 25

Slide 25 text

Tommy Mühle | tommy-muehle.io 25 https:/ /packagist.org/search/?q=enum

Slide 26

Slide 26 text

Tommy Mühle | tommy-muehle.io Summary 26

Slide 27

Slide 27 text

Questions?

Slide 28

Slide 28 text

Thank you! Slides http:/ /bit.ly/2isVOvl Images https:/ /pixabay.com/ @tommy_muehle