Slide 1

Slide 1 text

PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums

Slide 2

Slide 2 text

PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums

Slide 3

Slide 3 text

Ayesh Karunaratne

Slide 4

Slide 4 text

PHP 8.1 Enums

Slide 5

Slide 5 text

PHP 8.1 Enumerations

Slide 6

Slide 6 text

PHP 8.1 Enumerations

Slide 7

Slide 7 text

PHP 8.1 Enumerations

Slide 8

Slide 8 text

PHP 8.1 Enumerations: RFC Created Dec 04 2020 Nov 25 2021 Feb 03 2021 Voting started Feb 17 2021 Voting ended: 44:7 Apr 22 2021 Midwest PHP 2021

Slide 9

Slide 9 text

Why we need Enums How Enums can help Enums in PHP 8.1 Enum Semantics Usage Examples Trying out Enums today Backwards Compatibility PHP 8.1: Enums

Slide 10

Slide 10 text

Why we need Enums

Slide 11

Slide 11 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; curl_setopt_array($handle, $options); curl_exec($handle); Why we need Enums

Slide 12

Slide 12 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; curl_setopt_array($handle, $options); curl_exec($handle); Why we need Enums

Slide 13

Slide 13 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; var_dump($options); curl_setopt_array($handle, $options); curl_exec($handle); Why we need Enums

Slide 14

Slide 14 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; var_dump($options); curl_setopt_array($handle, $options); curl_exec($handle); array(3) { [10002]=> string(19) "https://example.com" [84]=> int(3) [19913]=> bool(true) } Why we need Enums

Slide 15

Slide 15 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; var_dump($options); curl_setopt_array($handle, $options); curl_exec($handle); array(3) { [10002]=> string(19) "https://example.com" [84]=> int(3) [19913]=> bool(true) } define ('CURLOPT_URL', 10002); define ('CURLOPT_HTTP_VERSION', 84); define ('CURL_HTTP_VERSION_1_1', 2); define ('CURL_HTTP_VERSION_2_0', 3); define ('CURLOPT_RETURNTRANSFER', 19913); Why we need Enums

Slide 16

Slide 16 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; var_dump($options); curl_setopt_array($handle, $options); curl_exec($handle); array(3) { [10002]=> string(19) "https://example.com" [84]=> int(3) [19913]=> bool(true) } define ('CURLOPT_URL', 10002); define ('CURLOPT_HTTP_VERSION', 84); define ('CURL_HTTP_VERSION_1_1', 2); define ('CURL_HTTP_VERSION_2_0', 3); define ('CURLOPT_RETURNTRANSFER', 19913); Why we need Enums

Slide 17

Slide 17 text

$handle = curl_init(); $options = [ CURLOPT_URL => 'https://example.com', CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_RETURNTRANSFER => true, ]; var_dump($options); curl_setopt_array($handle, $options); curl_exec($handle); array(3) { [10002]=> string(19) "https://example.com" [84]=> int(3) [19913]=> bool(true) } define ('CURLOPT_URL', 10002); define ('CURLOPT_HTTP_VERSION', 84); define ('CURL_HTTP_VERSION_1_1', 2); define ('CURL_HTTP_VERSION_2_0', 3); define ('CURLOPT_RETURNTRANSFER', 19913); Why we need Enums

Slide 18

Slide 18 text

function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {} Why we need Enums

Slide 19

Slide 19 text

function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {} Why we need Enums

Slide 20

Slide 20 text

function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {} curl_setopt($handle, 10003, 'https://example.com'); PHP Error: curl_setopt(): Argument #2 ($option) is not a valid cURL option in … on line … curl_setopt($handle, 10002, 'https://example.com'); 10002 - CURLOPT_URL curl_setopt($handle, 10004, 'https://example.com'); 10002 - CURLOPT_PROXY Why we need Enums

Slide 21

Slide 21 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void {} } Why we need Enums

Slide 22

Slide 22 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void {} } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); Why we need Enums

Slide 23

Slide 23 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void {} } $post = new Post(); $post->updateStatus('returned'); Why we need Enums

Slide 24

Slide 24 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void {} } $post = new Post(); $post->updateStatus('returned'); Why we need Enums

Slide 25

Slide 25 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void {} } Why we need Enums

Slide 26

Slide 26 text

class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } Why we need Enums

Slide 27

Slide 27 text

How Enums Can Help

Slide 28

Slide 28 text

enum PostStatuses { } How Enums Can Help

Slide 29

Slide 29 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } How Enums Can Help

Slide 30

Slide 30 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 31

Slide 31 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 32

Slide 32 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public string $status; public function updateStatus(string $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 33

Slide 33 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public PostStatuses $status; public function updateStatus(string $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 34

Slide 34 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public PostStatuses $status; public function updateStatus(PostStatuses $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 35

Slide 35 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public PostStatuses $status; public function updateStatus(PostStatuses $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 36

Slide 36 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public PostStatuses $status; public function updateStatus(PostStatuses $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\Post::POST_STATUS_PUBLISHED); How Enums Can Help

Slide 37

Slide 37 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public const POST_STATUS_DRAFT = 'draft'; public const POST_STATUS_PENDING = 'pending'; public const POST_STATUS_RETURNED = 'returned'; public const POST_STATUS_PUBLISHED = 'published'; public PostStatuses $status; public function updateStatus(PostStatuses $status): void { if ( $status !== static::POST_STATUS_DRAFT && $status !== static::POST_STATUS_PENDING && $status !== static::POST_STATUS_RETURNED && $status !== static::POST_STATUS_PUBLISHED ) { throw new InvalidArgumentException('Invalid state'); } } } $post = new Post(); $post->updateStatus(\PostStatuses::PUBLISHED); How Enums Can Help

Slide 38

Slide 38 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public PostStatuses $status; public function updateStatus(PostStatuses $status): void { } } $post = new Post(); $post->updateStatus(\PostStatuses::PUBLISHED); How Enums Can Help

Slide 39

Slide 39 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } function setIsSponsored(bool $sponsored): void { } function isSponsored(): bool { } setIsSponsored(true); setIsSponsored(false); How Enums Can Help

Slide 40

Slide 40 text

Enums in PHP 8.1

Slide 41

Slide 41 text

enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Unit Enums Enums in PHP 8.1

Slide 42

Slide 42 text

enum PostStatuses implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Unit Enums Enums in PHP 8.1

Slide 43

Slide 43 text

enum PostStatuses implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Unit Enums Enums in PHP 8.1

Slide 44

Slide 44 text

enum PostStatuses implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } echo PostStatuses::DRAFT->name; // "DRAFT" Unit Enums Enums in PHP 8.1

Slide 45

Slide 45 text

Backed Enums extend Unit Enums enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } Backed Enums Enums in PHP 8.1

Slide 46

Slide 46 text

enum PostStatuses: string implements BackedEnum { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } Backed Enums extend Unit Enums Backed Enums Enums in PHP 8.1

Slide 47

Slide 47 text

enum PostStatuses: string implements BackedEnum { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } interface BackedEnum extends UnitEnum { public static function from(int|string $value): static; public static function tryFrom(int|string $value): ?static; } Backed Enums extend Unit Enums Backed Enums echo PostStatuses::DRAFT->name; // "DRAFT“ echo PostStatuses::DRAFT->value; // "draft" Enums in PHP 8.1

Slide 48

Slide 48 text

Enum Semantics

Slide 49

Slide 49 text

Enum Semantics Enum Enumerated type that contains a fixed number of members.

Slide 50

Slide 50 text

Enum Semantics Enum Enumerated type that contains a fixed number of members. A type that is supported as parameter, return, and property type in PHP, and the type is enforced by PHP itself.

Slide 51

Slide 51 text

Enum Semantics Enum Enumerated type that contains a fixed number of members. All members are contained within a declared Enum.

Slide 52

Slide 52 text

Enum Semantics Enum Enumerated type that contains a fixed number of members. Members of an Enum is fixed at the declaration time. An enumerated member is identical to the same member everywhere. Enums must not contain state.

Slide 53

Slide 53 text

Enum Semantics Enumerated types enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } function play_card(Suit $suit, string $card) {} function pick_a_suit(): Suit { return Suit::Spades; } play_card(Suit::Spades, 'A'); var_dump(pick_a_suit()); // enum(Suit::Spades)

Slide 54

Slide 54 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } function play_card(Suit $suit, string $card) {} function pick_a_suit(): Suit { return Suit::Spades; } play_card(Fruits::Apple); play_card(Languages::English); play_card('potato'); Fatal error: Uncaught TypeError: play_card(): Argument #1 ($suit) must be of type Suit, string given Enumerated types

Slide 55

Slide 55 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Closed Set

Slide 56

Slide 56 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Closed Set namespace Foo\Bar;

Slide 57

Slide 57 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Fixed Members Suit::Spades === Suit::Spades

Slide 58

Slide 58 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Fixed Members enum RussianSuit extends Suit {} Parse error: syntax error, unexpected token "extends", expecting "{"

Slide 59

Slide 59 text

Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; private string $foo; } Fixed Members Fatal error: Enums may not include properties

Slide 60

Slide 60 text

Enum Semantics Enums can have zero or more cases enum ErrorStates { } enum HTTPMethods { case GET; case POST; }

Slide 61

Slide 61 text

Enum Semantics Enums may have optional values enum Suit: string { case Clubs = '♣'; case Diamonds = '♦'; case Hearts = '♥'; case Spades = '♠'; }

Slide 62

Slide 62 text

Enum Semantics Backed Enums must assign values for all cases enum HTTPMethods: string { case GET; case POST; } Fatal error: Case GET of backed enum HTTPMethods must have a value

Slide 63

Slide 63 text

Enum Semantics Enum cases and values must be unique Fatal error: Cannot redefine class constant Test::FOO enum Test { case FOO; case FOO; } enum Test: string { case FOO = 'baz'; case BAR = 'baz'; } Fatal error: Duplicate value in enum Test for cases FOO and BAR

Slide 64

Slide 64 text

Enum Semantics Class Semantics namespace Foo\Bar; enum PostStatuses: string implements EntityStatues { use TestTrait; case DRAFT = 'draft'; case PENDING = 'pending'; case RETURNED = 'returned'; case PUBLISHED = 'published’; public static function showOff(): void { echo __CLASS__ . static::class; } } • Supports namespaces • Supports traits • Supports autoloading • Supports magic constants • Supports instanceof • Supports methods

Slide 65

Slide 65 text

Usage Examples

Slide 66

Slide 66 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; }

Slide 67

Slide 67 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } }

Slide 68

Slide 68 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } }

Slide 69

Slide 69 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } }

Slide 70

Slide 70 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $stmt = $pdo->prepare(" SELECT * FROM posts WHERE post_status=?"); $stmt->execute([ PostStatuses::PUBLISHED->value ]); $post = $stmt->fetch();

Slide 71

Slide 71 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $stmt = $pdo->prepare(" SELECT * FROM posts WHERE post_status=?"); $stmt->execute([ PostStatuses::PUBLISHED->value ]); $post = $stmt->fetch();

Slide 72

Slide 72 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $sql = " INSERT INTO posts (id, title, post_status) VALUES (:id, :title, :post_status)"; $stmt= $pdo->prepare($sql); $stmt->execute([ 'id' => $post->getId(), 'title' => $post->getTitle(), 'post_status' => $post->getStatus()->value, ]);

Slide 73

Slide 73 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $sql = " INSERT INTO posts (id, title, post_status) VALUES (:id, :title, :post_status)"; $stmt= $pdo->prepare($sql); $stmt->execute([ 'id' => $post->getId(), 'title' => $post->getTitle(), 'post_status' => $post->getStatus()->value, ]);

Slide 74

Slide 74 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $result = [ 'id' => 42, 'title' => 'PHP Enums', 'post_status' => 'published', ]; $post = new Post( $result['id'], $result['title'] ); $post->updateStatus( PostStatuses::from($result['post_status']) );

Slide 75

Slide 75 text

Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatuses $status; public function __construct( int $id, string $title ) { // ... } public function updateStatus(PostStatuses $status): void { $this->status = $status; } public function getStatus(): PostStatuses { return $this->status; } } $result = [ 'id' => 42, 'title' => 'PHP Enums', 'post_status' => 'published', ]; $post = new Post( $result['id'], $result['title'] ); $post->updateStatus( PostStatuses::from($result['post_status']) );

Slide 76

Slide 76 text

Trying out Enums today

Slide 77

Slide 77 text

Trying out Enums today Try it online with 3v4l.org

Slide 78

Slide 78 text

Trying out Enums today Nightly Docker Images docker pull phpdaily/php:8.1-dev

Slide 79

Slide 79 text

Trying out Enums today Self-compile PHP from source $ git clone [email protected]:php/php-src.git $ ./buildconf $ ./configure $ make -j$(nproc) $ ./sapi/cli/php -a

Slide 80

Slide 80 text

Backwards Compatibility

Slide 81

Slide 81 text

Backwards Compatibility Enums is a new syntax Enums is a new syntax introduced in PHP 8.1, and not supported in older PHP versions. Parse error: syntax error, unexpected identifier "PostStatuses"

Slide 82

Slide 82 text

Backwards Compatibility User-land PHP implementations https://github.com/myclabs/php-enum use MyCLabs\Enum\Enum; class PostStatuses extends Enum { private const DRAFT = 'draft'; private const PENDING = 'pending'; private const RETURNED = 'returned'; private const PUBLISHED = 'published'; }

Slide 83

Slide 83 text

Further Resources • https://php.watch/versions/8.1/enums • https://php.watch/versions/8.1 • https://wiki.php.net/rfc/enumerations • https://phpinternals.news/73 • https://github.com/php/php-src/pull/6489/ • https://externals.io/message/112626 • https://github.com/phpdaily/php • https://3v4l.org/

Slide 84

Slide 84 text

Questions? @Ayeshlive [email protected] No question is too small. https://aye.sh/talk/midwest-php-2021-php-enums

Slide 85

Slide 85 text

Thank You Dank u dankie faleminderit shukran Շնորհակալություն hvala благодаря gràcies M ̀ h’gōi děkuji tak tänan kiitos Благодаря ти danke ευχαριστώ mahalo . הדות dhanyavād köszönöm takk terima kasih grazie arigatô cảm ơn bạn paldies choukrane ačiū Благодарам grazzi Xièxiè Баярлалаа dziękuję obrigado mulţumesc спасибо xвала Ďakujem gracias tack nandri kop khun teşekkür ederim Дякую diolch a dank ngiyabonga ස්තුතියි

Slide 86

Slide 86 text

PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums