Comparable
Compare enum instances using convenient methods.
Overview
Section titled “Overview”The Comparable trait provides methods for comparing enum instances:
is()- Check if equal to another instanceisNot()- Check if not equal to another instancein()- Check if in a list of instancesnotIn()- Check if not in a list of instances
use Cline\Enums\Concerns\Comparable;
enum TaskStatus: int{ use Comparable;
case Incomplete = 0; case Completed = 1; case Canceled = 2;}
enum Role{ use Comparable;
case Administrator; case Subscriber; case Guest;}Methods
Section titled “Methods”Check if an enum instance equals another:
$status = TaskStatus::Incomplete;
$status->is(TaskStatus::Incomplete); // true$status->is(TaskStatus::Completed); // false
$role = Role::Administrator;$role->is(Role::Administrator); // true$role->is(Role::Subscriber); // falseisNot()
Section titled “isNot()”Check if an enum instance does not equal another:
$status = TaskStatus::Incomplete;
$status->isNot(TaskStatus::Incomplete); // false$status->isNot(TaskStatus::Completed); // true
$role = Role::Administrator;$role->isNot(Role::Administrator); // false$role->isNot(Role::Subscriber); // trueCheck if an enum instance is in a list:
$status = TaskStatus::Incomplete;
$status->in([TaskStatus::Incomplete, TaskStatus::Completed]); // true$status->in([TaskStatus::Completed, TaskStatus::Canceled]); // false
$role = Role::Administrator;$role->in([Role::Administrator, Role::Guest]); // true$role->in([Role::Subscriber, Role::Guest]); // falsenotIn()
Section titled “notIn()”Check if an enum instance is not in a list:
$status = TaskStatus::Incomplete;
$status->notIn([TaskStatus::Incomplete, TaskStatus::Completed]); // false$status->notIn([TaskStatus::Completed, TaskStatus::Canceled]); // true
$role = Role::Administrator;$role->notIn([Role::Administrator, Role::Guest]); // false$role->notIn([Role::Subscriber, Role::Guest]); // trueUse Cases
Section titled “Use Cases”State Machine Logic
Section titled “State Machine Logic”class Task{ public function canTransition(TaskStatus $to): bool { return match($this->status) { TaskStatus::Incomplete => $to->in([ TaskStatus::Completed, TaskStatus::Canceled ]), TaskStatus::Completed => $to->is(TaskStatus::Incomplete), TaskStatus::Canceled => false, }; }}Permission Checks
Section titled “Permission Checks”class UserController{ public function edit(User $user) { if ($user->role->isNot(Role::Administrator)) { abort(403); }
// Edit logic... }}Filtering Collections
Section titled “Filtering Collections”$activeTasks = $tasks->filter(function ($task) { return $task->status->notIn([ TaskStatus::Completed, TaskStatus::Canceled ]);});Conditional Rendering
Section titled “Conditional Rendering”@if($order->status->in([OrderStatus::Pending, OrderStatus::Processing])) <button>Cancel Order</button>@endif
@if($user->role->is(Role::Administrator)) <a href="/admin">Admin Panel</a>@endifValidation Rules
Section titled “Validation Rules”public function rules(): array{ return [ 'status' => [ 'required', function ($attribute, $value, $fail) { $status = TaskStatus::tryFrom($value);
if (!$status || $status->in([TaskStatus::Archived, TaskStatus::Deleted])) { $fail('The selected status is invalid.'); } } ] ];}Benefits
Section titled “Benefits”The Comparable trait provides cleaner syntax than native PHP comparisons:
- Improved readability -
$status->is(TaskStatus::Completed)vs$status === TaskStatus::Completed - Simplified array operations -
in()andnotIn()replace verbosein_array()calls - Chainable conditions - Compose complex logic flows efficiently
- Consistent API - Aligns with patterns from other libraries and frameworks