SlideShare uma empresa Scribd logo
1 de 86
Baixar para ler offline
PHP 8.1 Enums
Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums
PHP 8.1 Enums
Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums
Ayesh Karunaratne
PHP 8.1 Enums
PHP 8.1 Enumerations
PHP 8.1 Enumerations
PHP 8.1 Enumerations
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
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
Why we need Enums
$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
$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
$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
$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
$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
$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
$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
function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {}
Why we need Enums
function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {}
Why we need Enums
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
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
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
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
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
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
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
How Enums Can Help
enum PostStatuses {
}
How Enums Can Help
enum PostStatuses {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
How Enums Can Help
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
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
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
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
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
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
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
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
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
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
Enums in PHP 8.1
enum PostStatuses {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
Unit Enums
Enums in PHP 8.1
enum PostStatuses implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
Unit Enums
Enums in PHP 8.1
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
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
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
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
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
Enum Semantics
Enum Semantics
Enum
Enumerated type that contains a fixed number of members.
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.
Enum Semantics
Enum
Enumerated type that contains a fixed number of members.
All members are contained within a declared Enum.
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.
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)
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
Enum Semantics
enum Suit {
case Spades;
case Hearts;
case Clubs;
case Diamonds;
}
Closed Set
Enum Semantics
enum Suit {
case Spades;
case Hearts;
case Clubs;
case Diamonds;
}
Closed Set
namespace FooBar;
Enum Semantics
enum Suit {
case Spades;
case Hearts;
case Clubs;
case Diamonds;
}
Fixed Members
Suit::Spades === Suit::Spades
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 "{"
Enum Semantics
enum Suit {
case Spades;
case Hearts;
case Clubs;
case Diamonds;
private string $foo;
}
Fixed Members
Fatal error: Enums may not include properties
Enum Semantics
Enums can have zero or more cases
enum ErrorStates {
}
enum HTTPMethods {
case GET;
case POST;
}
Enum Semantics
Enums may have optional values
enum Suit: string {
case Clubs = '♣';
case Diamonds = '♦';
case Hearts = '♥';
case Spades = '♠';
}
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
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
Enum Semantics
Class Semantics
namespace FooBar;
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
Usage Examples
Usage Examples
enum PostStatuses: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
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
) {
// ...
}
}
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
) {
// ...
}
}
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;
}
}
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();
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();
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,
]);
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,
]);
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'])
);
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'])
);
Trying out Enums today
Trying out Enums today
Try it online with 3v4l.org
Trying out Enums today
Nightly Docker Images
docker pull phpdaily/php:8.1-dev
Trying out Enums today
Self-compile PHP from source
$ git clone git@github.com:php/php-src.git
$ ./buildconf
$ ./configure
$ make -j$(nproc)
$ ./sapi/cli/php -a
Backwards Compatibility
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"
Backwards Compatibility
User-land PHP implementations
https://github.com/myclabs/php-enum
use MyCLabsEnumEnum;
class PostStatuses extends Enum {
private const DRAFT = 'draft';
private const PENDING = 'pending';
private const RETURNED = 'returned';
private const PUBLISHED = 'published';
}
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/
Questions?
@Ayeshlive ayesh@php.watch
No question is too small.
https://aye.sh/talk/midwest-php-2021-php-enums
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
ස්තුතියි
PHP 8.1 Enums
Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums

Mais conteúdo relacionado

Mais procurados

Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix itRafael Dohms
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP GeneratorsMark Baker
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixturesBill Chang
 
Design Patterns in PHP5
Design Patterns in PHP5 Design Patterns in PHP5
Design Patterns in PHP5 Wildan Maulana
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsŁukasz Chruściel
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Leonardo Proietti
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of LithiumNate Abele
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016Kacper Gunia
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretssmueller_sandsmedia
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolveXSolve
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsGuilherme Blanco
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 WorldFabien Potencier
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationŁukasz Chruściel
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 

Mais procurados (20)

Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy Applications
 
Shell.php
Shell.phpShell.php
Shell.php
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP Generators
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
 
Design Patterns in PHP5
Design Patterns in PHP5 Design Patterns in PHP5
Design Patterns in PHP5
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 

Semelhante a Php Enums

PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021Ayesh Karunaratne
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hackingJeroen van Dijk
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hackingJeroen van Dijk
 
Why is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosWhy is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosDivante
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesEric Poe
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium AppsNate Abele
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Elena Kolevska
 
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...Mateusz Zalewski
 
SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Developmentjsmith92
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 
You Don't Know Query (WordCamp Netherlands 2012)
You Don't Know Query (WordCamp Netherlands 2012)You Don't Know Query (WordCamp Netherlands 2012)
You Don't Know Query (WordCamp Netherlands 2012)andrewnacin
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsPierre MARTIN
 

Semelhante a Php Enums (20)

PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Intermediate PHP
Intermediate PHPIntermediate PHP
Intermediate PHP
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
Why is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosWhy is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenarios
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return Types
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium Apps
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
 
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
 
SOLID PRINCIPLES
SOLID PRINCIPLESSOLID PRINCIPLES
SOLID PRINCIPLES
 
Web Technology_10.ppt
Web Technology_10.pptWeb Technology_10.ppt
Web Technology_10.ppt
 
SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
 
2013 - Benjamin Eberlei - Doctrine 2
2013 - Benjamin Eberlei - Doctrine 22013 - Benjamin Eberlei - Doctrine 2
2013 - Benjamin Eberlei - Doctrine 2
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
You Don't Know Query (WordCamp Netherlands 2012)
You Don't Know Query (WordCamp Netherlands 2012)You Don't Know Query (WordCamp Netherlands 2012)
You Don't Know Query (WordCamp Netherlands 2012)
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 

Último

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 

Último (20)

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 

Php Enums

  • 1. PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums
  • 2. PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums
  • 8. 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
  • 9. 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
  • 10. Why we need Enums
  • 11. $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
  • 12. $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
  • 13. $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
  • 14. $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
  • 15. $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
  • 16. $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
  • 17. $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
  • 18. function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {} Why we need Enums
  • 19. function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {} Why we need Enums
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 28. enum PostStatuses { } How Enums Can Help
  • 29. enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } How Enums Can Help
  • 30. 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
  • 31. 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
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. 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
  • 38. 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
  • 39. 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
  • 41. enum PostStatuses { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Unit Enums Enums in PHP 8.1
  • 42. enum PostStatuses implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Unit Enums Enums in PHP 8.1
  • 43. 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
  • 44. 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
  • 45. 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
  • 46. 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
  • 47. 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
  • 49. Enum Semantics Enum Enumerated type that contains a fixed number of members.
  • 50. 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.
  • 51. Enum Semantics Enum Enumerated type that contains a fixed number of members. All members are contained within a declared Enum.
  • 52. 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.
  • 53. 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)
  • 54. 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
  • 55. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Closed Set
  • 56. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Closed Set namespace FooBar;
  • 57. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Fixed Members Suit::Spades === Suit::Spades
  • 58. 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 "{"
  • 59. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; private string $foo; } Fixed Members Fatal error: Enums may not include properties
  • 60. Enum Semantics Enums can have zero or more cases enum ErrorStates { } enum HTTPMethods { case GET; case POST; }
  • 61. Enum Semantics Enums may have optional values enum Suit: string { case Clubs = '♣'; case Diamonds = '♦'; case Hearts = '♥'; case Spades = '♠'; }
  • 62. 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
  • 63. 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
  • 64. Enum Semantics Class Semantics namespace FooBar; 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
  • 66. Usage Examples enum PostStatuses: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; }
  • 67. 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 ) { // ... } }
  • 68. 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 ) { // ... } }
  • 69. 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; } }
  • 70. 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();
  • 71. 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();
  • 72. 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, ]);
  • 73. 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, ]);
  • 74. 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']) );
  • 75. 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']) );
  • 77. Trying out Enums today Try it online with 3v4l.org
  • 78. Trying out Enums today Nightly Docker Images docker pull phpdaily/php:8.1-dev
  • 79. Trying out Enums today Self-compile PHP from source $ git clone git@github.com:php/php-src.git $ ./buildconf $ ./configure $ make -j$(nproc) $ ./sapi/cli/php -a
  • 81. 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"
  • 82. Backwards Compatibility User-land PHP implementations https://github.com/myclabs/php-enum use MyCLabsEnumEnum; class PostStatuses extends Enum { private const DRAFT = 'draft'; private const PENDING = 'pending'; private const RETURNED = 'returned'; private const PUBLISHED = 'published'; }
  • 83. 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/
  • 84. Questions? @Ayeshlive ayesh@php.watch No question is too small. https://aye.sh/talk/midwest-php-2021-php-enums
  • 85. 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 ස්තුතියි
  • 86. PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/midwest-php-2021-php-enums