PHP 8 News: Enumerations

PHP 8 News: Enumerations

Enumerations were introduced as a new feature in PHP 8.1. Enumerations, often referred to as enums, provide a way to define a set of named constants in PHP. They are a data type that consists of a fixed set of named values, which cannot be changed after declaration.

Defining an Enumeration:

To define an enumeration, you use the enum keyword followed by the name of the enumeration and a list of comma-separated constant values within braces {}.

enum Status {
    case Pending;
    case Approved;
    case Rejected;
}

Using Enumerations:

Once you've defined an enumeration, you can use it just like any other data type in PHP.

$status = Status::Pending;

Accessing Enumerations:

You access enumeration values using the double colon syntax
::.

$status = Status::Pending;

Type Safety:

Enumerations provide type safety. This means that if a function or method expects an enumeration value, passing anything else will result in a type error.

function processStatus(Status $status) {
    // Processing code
}

$status = Status::Approved;
processStatus($status); // Valid

$invalidStatus = 'Pending';
processStatus($invalidStatus); // Type error

Iteration:

You can iterate over the values of an enumeration using a foreach loop.

foreach (Status::cases() as $status) {
    echo $status;
}

Comparison:

Enumerations can be compared for equality using the === operator.

$status1 = Status::Pending;
$status2 = Status::Pending;

if ($status1 === $status2) {
    echo "Statuses are equal";
}

Backing Values:

By default, each constant in an enumeration has an implicit integer value starting from 0. However, you can explicitly assign values to the constants.

enum Status {
    case Pending = 1;
    case Approved = 2;
    case Rejected = 3;
}

Additional Methods:

Enumerations support additional methods like name(), value(), keys(), values(), ordinal(), and jsonSerialize(), which provide various functionalities like getting the name of the constant, its value, keys, values, ordinal position, and serialization respectively.

Enumerations in PHP 8.1 provide a convenient and type-safe way to define a set of related constants, improving code readability, maintainability, and reducing the likelihood of errors related to using incorrect constant values.

More examples

Basic Enumeration:

enum Direction {
    case North;
    case South;
    case East;
    case West;
}

$direction = Direction::North;
echo $direction; // Output: Direction::North

Enumeration with Backing Values:

enum Priority {
    case Low = 1;
    case Medium = 5;
    case High = 10;
}

$priority = Priority::High;
echo $priority->value(); // Output: 10

Type Safety:

function processPriority(Priority $priority) {
    echo "Processing priority: $priority";
}

$priority = Priority::Medium;
processPriority($priority); // Valid

$invalidPriority = 'Low';
processPriority($invalidPriority); // Type error

Iteration:

foreach (Priority::cases() as $priority) {
    echo $priority . "\n";
}
// Output:
// Priority::Low
// Priority::Medium
// Priority::High

Comparison:

$priority1 = Priority::Low;
$priority2 = Priority::Low;

if ($priority1 === $priority2) {
    echo "Priorities are equal\n";
}
// Output: Priorities are equal

Using Methods:

$priority = Priority::Medium;
echo $priority->name() . "\n"; // Output: Medium
echo $priority->ordinal() . "\n"; // Output: 2
echo json_encode($priority) . "\n"; // Output: "2"

These examples showcase different aspects of enumerations in PHP 8.1, including defining enums, assigning backing values, ensuring type safety, iterating over enum values, comparing enum values, and utilizing enumeration methods for various operations.