SlideShare una empresa de Scribd logo
1 de 122
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

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 GeneratorsMark Baker
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
PHP for Python Developers
PHP for Python DevelopersPHP for Python Developers
PHP for Python DevelopersCarlos 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 FrameworksNate Abele
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium AppsNate Abele
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsMark Baker
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Jakub 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 clienteLeonardo Proietti
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War StoriesJakub 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 EditionNate Abele
 

La actualidad más candente (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 a PHP 8.1: Enums

PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021Ayesh Karunaratne
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hackingJeroen van Dijk
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesEric 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 / XSolveXSolve
 
[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 hackingJeroen van Dijk
 
Why is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosWhy is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosDivante
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit TestingMike 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 5Elena Kolevska
 
関西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 IteratorsMark Baker
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsPierre 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 a 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
 

Último

MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Hararemasabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 

Último (20)

MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 

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