SlideShare a Scribd company logo
PHP 8.1 Enums
Ayesh Karunaratne | https://aye.sh/talk/oxford-php-enums
PHP 8.1 Enums
Ayesh Karunaratne | https://aye.sh/talk/oxford-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
04 Dec 2020
25 Nov 2021
03 Feb 2021 Voting started
17 Feb 2021 Voting ended: 44:7
28 Apr 2021 Oxford PHP - April 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
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');
10004 - CURLOPT_PROXY
Why we need Enums
function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {}
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
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
https://en.wikipedia.org/wiki/Open-closed_principle
How Enums Can Help
How Enums Can Help
type PostStatus = "draft" | "pending" | "returned" | "published";
How Enums Can Help
type PostStatus = "draft" | "pending" | "returned" | "published";
function updateStatus(status: PostStatus) {}
How Enums Can Help
type PostStatus = "draft" | "pending" | "returned" | "published";
function updateStatus(status: PostStatus) {}
How Enums Can Help
type PostStatus = "draft" | "pending" | "returned" | "published";
function updateStatus(status: PostStatus) {}
updateStatus("potato");
Argument of type '"potato"' is not assignable to
parameter of type 'PostStatus'.
updateStatus("draft");
✔️
How Enums Can Help
How Enums Can Help
enum PostStatus {
DRAFT,
PENDING,
PUBLISHED,
RETURNED,
};
function updateStatus(status: PostStatus) {
}
updateStatus(PostStatus.DRAFT);
How Enums Can Help
enum PostStatus {
DRAFT = "draft",
PENDING = "pending",
PUBLISHED = "published",
RETURNED = "draft",
};
function updateStatus(status: PostStatus) {
}
updateStatus(PostStatus.DRAFT);
How Enums Can Help
enum PostStatus {
DRAFT = "draft",
PENDING = "pending",
PUBLISHED = "published",
RETURNED = "draft",
};
enum PostStatus {
DRAFT = "draft";
PENDING = "pending";
PUBLISHED = "published";
RETURNED = "draft";
};
enum PostStatus {
}
How Enums Can Help
enum PostStatus {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
How Enums Can Help
enum PostStatus {
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 PostStatus {
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 PostStatus {
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 PostStatus {
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 PostStatus $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 PostStatus {
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 PostStatus $status;
public function updateStatus(PostStatus $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 PostStatus {
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 PostStatus $status;
public function updateStatus(PostStatus $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 PostStatus {
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 PostStatus $status;
public function updateStatus(PostStatus $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 PostStatus {
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 PostStatus $status;
public function updateStatus(PostStatus $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(PostStatus::PUBLISHED);
How Enums Can Help
enum PostStatus {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
class Post {
public PostStatus $status;
public function updateStatus(PostStatus $status): void {
}
}
$post = new Post();
$post->updateStatus(PostStatus::PUBLISHED);
How Enums Can Help
enum PostStatus {
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
Enums in PHP 8.1
enum Suit {
}
• Enums can have zero or more members
Enums in PHP 8.1
enum Suit {
case Clubs;
case Diamonds;
case Spades;
case Hearts;
}
• Enums can have zero or more members
Enums in PHP 8.1
enum Suit {
case Clubs;
case Diamonds;
case Spades;
case Hearts;
}
• Enums can have zero or more members
• Enum members are objects
is_object(Suit::Hearts);
// true
Enums in PHP 8.1
enum Suit {
case Clubs;
case Diamonds;
case Spades;
case Hearts;
}
• Enums can have zero or more members
• Enum members are objects
var_dump(Suit::Hearts);
// enum(Suit::Hearts)
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit {
case Clubs;
case Diamonds;
case Spades;
case Hearts;
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: int {
case Clubs = 1;
case Diamonds = 2;
case Spades = 3;
case Hearts = 4;
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
case Clubs = '♣️';
case Diamonds = '♦️';
case Spades = '♠️';
case Hearts = '♥️';
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = '♣️';
case Diamonds = '♦️';
case Spades = '♠️';
case Hearts = '♥️';
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = '♣️';
case Diamonds = '♦️';
case Spades = '♠️';
case Hearts = '♥️';
public static function cheer(): void {
echo 'Yay!';
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
Suit::cheer();
// Yay!
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = ' ';
case Diamonds = ' ';
case Spades = ' ';
case Hearts = ' ';
public static function cheer(): void {
echo 'Yay!';
}
public function show(): void {
var_dump($this);
var_dump($this->name);
var_dump(self::Clubs->name);
var_dump($this->value);
var_dump(self::Clubs->value);
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
• May contain non-static methods
Suit::Clubs->show();
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = ' ';
case Diamonds = ' ';
case Spades = ' ';
case Hearts = ' ';
public static function cheer(): void {
echo 'Yay!';
}
public function show(): void {
var_dump($this);
var_dump($this->name);
var_dump(self::Clubs->name);
var_dump($this->value);
var_dump(self::Clubs->value);
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
• May contain non-static methods
• $this refers to the Enumerated element
Suit::Clubs->show();
enum(AppPlayingCardsSuit::Clubs)
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = ' ';
case Diamonds = ' ';
case Spades = ' ';
case Hearts = ' ';
public static function cheer(): void {
echo 'Yay!';
}
public function show(): void {
var_dump($this);
var_dump($this->name);
var_dump(self::Clubs->name);
var_dump($this->value);
var_dump(self::Clubs->value);
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
• May contain non-static methods
• $this refers to the Enumerated element
• ->name property is the name of the member
Suit::Clubs->show();
enum(AppPlayingCardsSuit::Clubs)
string(5) "Clubs"
string(5) "Clubs"
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = ' ';
case Diamonds = ' ';
case Spades = ' ';
case Hearts = ' ';
public static function cheer(): void {
echo 'Yay!';
}
public function show(): void {
var_dump($this);
var_dump($this->name);
var_dump(self::Clubs->name);
var_dump($this->value);
var_dump(self::Clubs->value);
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
• May contain non-static methods
• $this refers to the Enumerated element
• ->name property is the name of the member
• ->value property is the backed value
Suit::Clubs->show();
enum(AppPlayingCardsSuit::Clubs)
string(5) "Clubs"
string(5) "Clubs"
string(6) "♣️"
string(6) "♣️"
Enums in PHP 8.1
namespace AppPlayingCards;
enum Suit: string {
const AWESOME = 'Yes';
case Clubs = ' ';
case Diamonds = ' ';
case Spades = ' ';
case Hearts = ' ';
public static function cheer(): void {
echo 'Yay!';
}
public function show(): void {
var_dump($this);
var_dump($this->name);
var_dump(self::Clubs->name);
var_dump($this->value);
var_dump(self::Clubs->value);
}
}
• Enums can have zero or more members
• Enum members are objects
• Enums can be namespaced and autoloaded
• May contain string|int backed values
• May contain non-duplicated constants
• May contain static methods
• May contain non-static methods
• $this refers to the Enumerated element
• ->name property is the name of the member
• ->value property is the backed value
Suit::Clubs->show();
enum(AppPlayingCardsSuit::Clubs)
string(5) "Clubs"
string(5) "Clubs"
string(6) "♣️"
string(6) "♣️"
enum PostStatus {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
Enums in PHP 8.1
Unit Enums
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
Enums in PHP 8.1
Unit Enums
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
PostStatus::cases();
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
array(4) {
[0]=> enum(PostStatus::DRAFT)
[1]=> enum(PostStatus::PENDING)
[2]=> enum(PostStatus::RETURNED)
[3]=> enum(PostStatus::PUBLISHED)
}
PostStatus::cases();
enum PostStatus implements UnitEnum {
case DRAFT;
case PENDING;
case RETURNED;
case PUBLISHED;
}
interface UnitEnum {
public static function cases(): array;
}
Enums in PHP 8.1
Unit Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
array(4) {
[0]=> enum(PostStatus::DRAFT)
[1]=> enum(PostStatus::PENDING)
[2]=> enum(PostStatus::RETURNED)
[3]=> enum(PostStatus::PUBLISHED)
}
PostStatus::cases();
enum PostStatus: string {
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 PostStatus: string implements BackedEnum {
case DRAFT = 'draft';
case PENDING = 'pending';
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum(PostStatus::DRAFT)
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum(PostStatus::DRAFT)
PostStatus::tryFrom('potato');
PostStatus::from('potato');
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum(PostStatus::DRAFT)
PostStatus::tryFrom('potato');
PostStatus::from('potato');
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum(PostStatus::DRAFT)
PostStatus::tryFrom('potato');
// null
PostStatus::from('potato');
Uncaught ValueError: "potato" is not a valid backing value
for enum "PostStatus"
enum PostStatus: 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;
}
Enums in PHP 8.1
Backed Enums extend Unit Enums
Backed Enums
echo PostStatus::DRAFT->name;
// "DRAFT"
echo PostStatus::DRAFT->value;
// "draft"
PostStatus::tryFrom('draft');
PostStatus::from('draft');
enum(PostStatus::DRAFT)
PostStatus::tryFrom('potato');
// null
PostStatus::from('potato');
Uncaught ValueError: "potato" is not a valid backing value
for enum "PostStatus"
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;
}
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;
}
No Properties Allowed
Fatal error: Enums may not include properties
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 PostStatus: 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 PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
} $stmt = $pdo->prepare("
SELECT *
FROM posts
WHERE post_status=?");
$stmt->execute([
PostStatus::PUBLISHED->value
]);
$post = $stmt->fetch();
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
} $stmt = $pdo->prepare("
SELECT *
FROM posts
WHERE post_status=?");
$stmt->execute([
PostStatus::PUBLISHED->value
]);
$post = $stmt->fetch();
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
}
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
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 PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
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 PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
public function updateStatus(
PostStatus $status
): void {
}
}
$result = [
'id' => 42,
'title' => 'PHP Enums',
'post_status' => 'published',
];
$post = new Post(
$result['id'],
$result['title']
);
$post->updateStatus(
PostStatus::from($result['post_status'])
);
Usage Examples
enum PostStatus: string {
case DRAFT = 'draft';
case PENDING = 'pending’;
case RETURNED = 'returned';
case PUBLISHED = 'published';
}
class Post {
private int $id;
private string $title;
private PostStatus $status;
public function __construct(
int $id,
string $title,
PostStatus $status
) {
// ...
}
public function getStatus(): PostStatus {
return $this->status;
}
public function updateStatus(
PostStatus $status
): void {
}
}
$result = [
'id' => 42,
'title' => 'PHP Enums',
'post_status' => 'published',
];
$post = new Post(
$result['id'],
$result['title']
);
$post->updateStatus(
PostStatus::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
https://php.watch/articles/compile-php-ubuntu
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 "PostStatus"
Backwards Compatibility
User-land PHP implementations
https://github.com/myclabs/php-enum
use MyCLabsEnumEnum;
class PostStatus extends Enum {
private const DRAFT = 'draft';
private const PENDING = 'pending';
private const RETURNED = 'returned';
private const PUBLISHED = 'published';
}
Further Resources
• https://aye.sh/talk/oxford-php-enums
• 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/
• https://php.watch/articles/compile-php-ubuntu
Questions?
@Ayeshlive ayesh@php.watch
No question is too small.
https://aye.sh/talk/oxford-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
ස්තුතියි
Ayesh Karunaratne | https://aye.sh/talk/oxford-php-enums
PHP 8.1 Enums

More Related Content

What's hot

SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Developmentjsmith92
 
A Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP GeneratorsA Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP Generators
Mark Baker
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
Hugo Hamon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
Hugo Hamon
 
PHP for Python Developers
PHP for Python DevelopersPHP for Python Developers
PHP for Python Developers
Carlos Vences
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
Nate Abele
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium Apps
Nate Abele
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
Kris Wallsmith
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL Iterators
Mark Baker
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12
Jakub Zalas
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War Stories
Jakub Zalas
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersLin Yo-An
 
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Nate Abele
 
Oops in php
Oops in phpOops in php

What's hot (20)

SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
 
A Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP GeneratorsA Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP Generators
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3
 
PHP for Python Developers
PHP for Python DevelopersPHP for Python Developers
PHP for Python Developers
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium Apps
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL Iterators
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War Stories
 
Shell.php
Shell.phpShell.php
Shell.php
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
 
Oops in php
Oops in phpOops in php
Oops in php
 

Similar to PHP 8.1: Enums

PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021
Ayesh Karunaratne
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
Jeroen van Dijk
 
Intermediate PHP
Intermediate PHPIntermediate PHP
Intermediate PHP
Bradley Holt
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return Types
Eric Poe
 
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
XSolve
 
[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
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
Jeroen 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 scenarios
Divante
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit Testing
Mike Lively
 
Php Reusing Code And Writing Functions
Php Reusing Code And Writing FunctionsPhp Reusing Code And Writing Functions
Php Reusing Code And Writing Functionsmussawir20
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
Solid principles
Solid principlesSolid principles
Solid principles
Bastian Feder
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
Hisateru Tanaka
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Fabien Potencier
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL Iterators
Mark Baker
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
Marcello Duarte
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
Pierre MARTIN
 
Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Designunodelostrece
 
2014 database - course 2 - php
2014 database - course 2 - php2014 database - course 2 - php
2014 database - course 2 - phpHung-yu Lin
 

Similar to PHP 8.1: 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
 
Intermediate PHP
Intermediate PHPIntermediate PHP
Intermediate PHP
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return Types
 
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
 
[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ć ...
 
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
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit Testing
 
Php Reusing Code And Writing Functions
Php Reusing Code And Writing FunctionsPhp Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
 
Solid principles
Solid principlesSolid principles
Solid principles
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL Iterators
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 
Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Design
 
2014 database - course 2 - php
2014 database - course 2 - php2014 database - course 2 - php
2014 database - course 2 - php
 

Recently uploaded

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
abdulrafaychaudhry
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
QuickwayInfoSystems3
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
abdulrafaychaudhry
 

Recently uploaded (20)

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
 

PHP 8.1: Enums

  • 1. PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/oxford-php-enums
  • 2. PHP 8.1 Enums Ayesh Karunaratne | https://aye.sh/talk/oxford-php-enums
  • 8. PHP 8.1 Enumerations: RFC Created 04 Dec 2020 25 Nov 2021 03 Feb 2021 Voting started 17 Feb 2021 Voting ended: 44:7 28 Apr 2021 Oxford PHP - April 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. Why we need Enums function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {}
  • 20. 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'); 10004 - CURLOPT_PROXY Why we need Enums function curl_setopt(CurlHandle $handle, int $option, mixed $value) : bool {}
  • 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
  • 27. 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 https://en.wikipedia.org/wiki/Open-closed_principle
  • 29. How Enums Can Help type PostStatus = "draft" | "pending" | "returned" | "published";
  • 30. How Enums Can Help type PostStatus = "draft" | "pending" | "returned" | "published"; function updateStatus(status: PostStatus) {}
  • 31. How Enums Can Help type PostStatus = "draft" | "pending" | "returned" | "published"; function updateStatus(status: PostStatus) {}
  • 32. How Enums Can Help type PostStatus = "draft" | "pending" | "returned" | "published"; function updateStatus(status: PostStatus) {} updateStatus("potato"); Argument of type '"potato"' is not assignable to parameter of type 'PostStatus'. updateStatus("draft"); ✔️
  • 34. How Enums Can Help enum PostStatus { DRAFT, PENDING, PUBLISHED, RETURNED, }; function updateStatus(status: PostStatus) { } updateStatus(PostStatus.DRAFT);
  • 35. How Enums Can Help enum PostStatus { DRAFT = "draft", PENDING = "pending", PUBLISHED = "published", RETURNED = "draft", }; function updateStatus(status: PostStatus) { } updateStatus(PostStatus.DRAFT);
  • 36. How Enums Can Help enum PostStatus { DRAFT = "draft", PENDING = "pending", PUBLISHED = "published", RETURNED = "draft", }; enum PostStatus { DRAFT = "draft"; PENDING = "pending"; PUBLISHED = "published"; RETURNED = "draft"; };
  • 37. enum PostStatus { } How Enums Can Help
  • 38. enum PostStatus { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } How Enums Can Help
  • 39. enum PostStatus { 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
  • 40. enum PostStatus { 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
  • 41. enum PostStatus { 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
  • 42. enum PostStatus { 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 PostStatus $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
  • 43. enum PostStatus { 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 PostStatus $status; public function updateStatus(PostStatus $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
  • 44. enum PostStatus { 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 PostStatus $status; public function updateStatus(PostStatus $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
  • 45. enum PostStatus { 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 PostStatus $status; public function updateStatus(PostStatus $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
  • 46. enum PostStatus { 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 PostStatus $status; public function updateStatus(PostStatus $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(PostStatus::PUBLISHED); How Enums Can Help
  • 47. enum PostStatus { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } class Post { public PostStatus $status; public function updateStatus(PostStatus $status): void { } } $post = new Post(); $post->updateStatus(PostStatus::PUBLISHED); How Enums Can Help
  • 48. enum PostStatus { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } function setIsSponsored(bool $sponsored): void { } function isSponsored(): bool { } setIsSponsored(true); setIsSponsored(false); How Enums Can Help
  • 50. Enums in PHP 8.1 enum Suit { } • Enums can have zero or more members
  • 51. Enums in PHP 8.1 enum Suit { case Clubs; case Diamonds; case Spades; case Hearts; } • Enums can have zero or more members
  • 52. Enums in PHP 8.1 enum Suit { case Clubs; case Diamonds; case Spades; case Hearts; } • Enums can have zero or more members • Enum members are objects is_object(Suit::Hearts); // true
  • 53. Enums in PHP 8.1 enum Suit { case Clubs; case Diamonds; case Spades; case Hearts; } • Enums can have zero or more members • Enum members are objects var_dump(Suit::Hearts); // enum(Suit::Hearts)
  • 54. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit { case Clubs; case Diamonds; case Spades; case Hearts; } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded
  • 55. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: int { case Clubs = 1; case Diamonds = 2; case Spades = 3; case Hearts = 4; } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values
  • 56. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { case Clubs = '♣️'; case Diamonds = '♦️'; case Spades = '♠️'; case Hearts = '♥️'; } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values
  • 57. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = '♣️'; case Diamonds = '♦️'; case Spades = '♠️'; case Hearts = '♥️'; } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants
  • 58. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = '♣️'; case Diamonds = '♦️'; case Spades = '♠️'; case Hearts = '♥️'; public static function cheer(): void { echo 'Yay!'; } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods Suit::cheer(); // Yay!
  • 59. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = ' '; case Diamonds = ' '; case Spades = ' '; case Hearts = ' '; public static function cheer(): void { echo 'Yay!'; } public function show(): void { var_dump($this); var_dump($this->name); var_dump(self::Clubs->name); var_dump($this->value); var_dump(self::Clubs->value); } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods • May contain non-static methods Suit::Clubs->show();
  • 60. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = ' '; case Diamonds = ' '; case Spades = ' '; case Hearts = ' '; public static function cheer(): void { echo 'Yay!'; } public function show(): void { var_dump($this); var_dump($this->name); var_dump(self::Clubs->name); var_dump($this->value); var_dump(self::Clubs->value); } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods • May contain non-static methods • $this refers to the Enumerated element Suit::Clubs->show(); enum(AppPlayingCardsSuit::Clubs)
  • 61. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = ' '; case Diamonds = ' '; case Spades = ' '; case Hearts = ' '; public static function cheer(): void { echo 'Yay!'; } public function show(): void { var_dump($this); var_dump($this->name); var_dump(self::Clubs->name); var_dump($this->value); var_dump(self::Clubs->value); } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods • May contain non-static methods • $this refers to the Enumerated element • ->name property is the name of the member Suit::Clubs->show(); enum(AppPlayingCardsSuit::Clubs) string(5) "Clubs" string(5) "Clubs"
  • 62. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = ' '; case Diamonds = ' '; case Spades = ' '; case Hearts = ' '; public static function cheer(): void { echo 'Yay!'; } public function show(): void { var_dump($this); var_dump($this->name); var_dump(self::Clubs->name); var_dump($this->value); var_dump(self::Clubs->value); } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods • May contain non-static methods • $this refers to the Enumerated element • ->name property is the name of the member • ->value property is the backed value Suit::Clubs->show(); enum(AppPlayingCardsSuit::Clubs) string(5) "Clubs" string(5) "Clubs" string(6) "♣️" string(6) "♣️"
  • 63. Enums in PHP 8.1 namespace AppPlayingCards; enum Suit: string { const AWESOME = 'Yes'; case Clubs = ' '; case Diamonds = ' '; case Spades = ' '; case Hearts = ' '; public static function cheer(): void { echo 'Yay!'; } public function show(): void { var_dump($this); var_dump($this->name); var_dump(self::Clubs->name); var_dump($this->value); var_dump(self::Clubs->value); } } • Enums can have zero or more members • Enum members are objects • Enums can be namespaced and autoloaded • May contain string|int backed values • May contain non-duplicated constants • May contain static methods • May contain non-static methods • $this refers to the Enumerated element • ->name property is the name of the member • ->value property is the backed value Suit::Clubs->show(); enum(AppPlayingCardsSuit::Clubs) string(5) "Clubs" string(5) "Clubs" string(6) "♣️" string(6) "♣️"
  • 64. enum PostStatus { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Enums in PHP 8.1 Unit Enums
  • 65. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } Enums in PHP 8.1 Unit Enums
  • 66. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums
  • 67. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums echo PostStatus::DRAFT->name; // "DRAFT"
  • 68. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums echo PostStatus::DRAFT->name; // "DRAFT"
  • 69. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums echo PostStatus::DRAFT->name; // "DRAFT" PostStatus::cases();
  • 70. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums echo PostStatus::DRAFT->name; // "DRAFT" array(4) { [0]=> enum(PostStatus::DRAFT) [1]=> enum(PostStatus::PENDING) [2]=> enum(PostStatus::RETURNED) [3]=> enum(PostStatus::PUBLISHED) } PostStatus::cases();
  • 71. enum PostStatus implements UnitEnum { case DRAFT; case PENDING; case RETURNED; case PUBLISHED; } interface UnitEnum { public static function cases(): array; } Enums in PHP 8.1 Unit Enums echo PostStatus::DRAFT->name; // "DRAFT" array(4) { [0]=> enum(PostStatus::DRAFT) [1]=> enum(PostStatus::PENDING) [2]=> enum(PostStatus::RETURNED) [3]=> enum(PostStatus::PUBLISHED) } PostStatus::cases();
  • 72. enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } Backed Enums extend Unit Enums Backed Enums Enums in PHP 8.1
  • 73. enum PostStatus: string implements BackedEnum { case DRAFT = 'draft'; case PENDING = 'pending'; case RETURNED = 'returned'; case PUBLISHED = 'published'; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums
  • 74. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums
  • 75. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT"
  • 76. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT"
  • 77. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft"
  • 78. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft');
  • 79. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft');
  • 80. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft');
  • 81. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft'); enum(PostStatus::DRAFT)
  • 82. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft'); enum(PostStatus::DRAFT) PostStatus::tryFrom('potato'); PostStatus::from('potato');
  • 83. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft'); enum(PostStatus::DRAFT) PostStatus::tryFrom('potato'); PostStatus::from('potato');
  • 84. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft'); enum(PostStatus::DRAFT) PostStatus::tryFrom('potato'); // null PostStatus::from('potato'); Uncaught ValueError: "potato" is not a valid backing value for enum "PostStatus"
  • 85. enum PostStatus: 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; } Enums in PHP 8.1 Backed Enums extend Unit Enums Backed Enums echo PostStatus::DRAFT->name; // "DRAFT" echo PostStatus::DRAFT->value; // "draft" PostStatus::tryFrom('draft'); PostStatus::from('draft'); enum(PostStatus::DRAFT) PostStatus::tryFrom('potato'); // null PostStatus::from('potato'); Uncaught ValueError: "potato" is not a valid backing value for enum "PostStatus"
  • 87. Enum Semantics Enum Enumerated type that contains a fixed number of members.
  • 88. 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.
  • 89. Enum Semantics Enum Enumerated type that contains a fixed number of members. All members are contained within a declared Enum.
  • 90. 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.
  • 91. 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)
  • 92. 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
  • 93. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Closed Set
  • 94. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; } Fixed Members Suit::Spades === Suit::Spades
  • 95. 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 "{"
  • 96. Enum Semantics enum Suit { case Spades; case Hearts; case Clubs; case Diamonds; private string $foo; } No Properties Allowed Fatal error: Enums may not include properties
  • 97. 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
  • 98. 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
  • 99. Enum Semantics Class Semantics namespace FooBar; enum PostStatus: 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
  • 101. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; }
  • 102. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 103. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 104. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 105. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 106. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } $stmt = $pdo->prepare(" SELECT * FROM posts WHERE post_status=?"); $stmt->execute([ PostStatus::PUBLISHED->value ]); $post = $stmt->fetch(); class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 107. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } $stmt = $pdo->prepare(" SELECT * FROM posts WHERE post_status=?"); $stmt->execute([ PostStatus::PUBLISHED->value ]); $post = $stmt->fetch(); class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } }
  • 108. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { 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, ]);
  • 109. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { 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, ]);
  • 110. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } public function updateStatus( PostStatus $status ): void { } } $result = [ 'id' => 42, 'title' => 'PHP Enums', 'post_status' => 'published', ]; $post = new Post( $result['id'], $result['title'] ); $post->updateStatus( PostStatus::from($result['post_status']) );
  • 111. Usage Examples enum PostStatus: string { case DRAFT = 'draft'; case PENDING = 'pending’; case RETURNED = 'returned'; case PUBLISHED = 'published'; } class Post { private int $id; private string $title; private PostStatus $status; public function __construct( int $id, string $title, PostStatus $status ) { // ... } public function getStatus(): PostStatus { return $this->status; } public function updateStatus( PostStatus $status ): void { } } $result = [ 'id' => 42, 'title' => 'PHP Enums', 'post_status' => 'published', ]; $post = new Post( $result['id'], $result['title'] ); $post->updateStatus( PostStatus::from($result['post_status']) );
  • 113. Trying out Enums today Try it online with 3v4l.org
  • 114. Trying out Enums today Nightly Docker Images docker pull phpdaily/php:8.1-dev
  • 115. 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 https://php.watch/articles/compile-php-ubuntu
  • 117. 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 "PostStatus"
  • 118. Backwards Compatibility User-land PHP implementations https://github.com/myclabs/php-enum use MyCLabsEnumEnum; class PostStatus extends Enum { private const DRAFT = 'draft'; private const PENDING = 'pending'; private const RETURNED = 'returned'; private const PUBLISHED = 'published'; }
  • 119. Further Resources • https://aye.sh/talk/oxford-php-enums • 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/ • https://php.watch/articles/compile-php-ubuntu
  • 120. Questions? @Ayeshlive ayesh@php.watch No question is too small. https://aye.sh/talk/oxford-php-enums
  • 121. 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 ස්තුතියි
  • 122. Ayesh Karunaratne | https://aye.sh/talk/oxford-php-enums PHP 8.1 Enums