marc-mabe/php-enum
Native PHP enum implementation via an abstract base class. Extend it to define enumerations from public constants (supports scalars, null, and arrays), create and compare enum instances, and keep a strict set of named values for safer domain modeling.
Start by requiring the package via Composer: composer require marc-mabe/php-enum. Then define your own enum class by extending MabeEnum\Enum and declaring public constants — these become the enum values. Keep values scalar (string, int, bool, null, float) or array-like for flexibility.
First use case: Replace magic strings/ints in domain logic. For example, a UserStatus enum avoids ambiguity like 'active', 'a', or 1:
use MabeEnum\Enum;
class UserStatus extends Enum
{
const INACTIVE = 'i';
const ACTIVE = 'a';
const DELETED = 'd';
}
Then enforce type safety: type-hint UserStatus $status in services or models, and instantiate via UserStatus::ACTIVE() or UserStatus::get('a').
UserStatus $status for strict typing; prefer immutable .() calls (e.g., UserStatus::ACTIVE()) when passing to constructors/setters — though get($value) handles raw scalars safely.UserStatus::INACTIVE() in the getter (lazy init) or constructor.EnumSet for efficient set operations:
$set = new EnumSet(UserStatus::class, [UserStatus::ACTIVE, UserStatus::INACTIVE]);
$set->add(UserStatus::DELETED()); // mutable
$set = $set->without(UserStatus::DELETED()); // immutable
$map = new EnumMap(UserStatus::class);
$map[UserStatus::ACTIVE] = 'Active';
echo $map[UserStatus::ACTIVE]; // 'Active'
UserStatus::byValue($input) or UserStatus::byName($input) for safe parsing — falls back to null if invalid, avoiding exceptions.public constants become enum values — protected/private are silently ignored; double-check constants are public.UserStatus::ACTIVE() === UserStatus::ACTIVE() is true, but UserStatus::get('a') === UserStatus::ACTIVE() also true — not true across different enum classes with same value.UserStatus $status accepts subclasses — to prevent this, final your enum class.EnumSerializableTrait helps but breaks singleton guarantees. Prefer storing raw values (e.g., 'a') and reconstructing on hydration.is() vs ===: Use $status->is(UserStatus::ACTIVE) — it handles both objects and raw values (UserStatus::ACTIVE constant or string 'a').TRUE, FUNCTION, etc., are safe as constant names — use them to map to reserved words (e.g., const FUNCTION = 'function').getEnumerators() for bulk checks instead of looping byValue().var_dump($status) shows internal singleton; use $status->getValue() for readable output.How can I help you explore Laravel packages today?