PHPackages                             kugaudo/php-enum - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. kugaudo/php-enum

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

kugaudo/php-enum
================

Tiny Java-styled enumeration support for PHP

v1.0(8y ago)117PHPPHP ^5.6 || ^7.0

Since Nov 30Pushed 8y agoCompare

[ Source](https://github.com/kugaudo/php-enum)[ Packagist](https://packagist.org/packages/kugaudo/php-enum)[ RSS](/packages/kugaudo-php-enum/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (1)DependenciesVersions (2)Used By (0)

php-enum
========

[](#php-enum)

Tiny Java-styled enumeration support for PHP based on traits.
Supports identifier-driven enums and class extensions (see [/samples](samples)).

Installation with composer:

```
composer require kugaudo/php-enum
```

The minimalistic sample of enumeration class looks like:

```
final class GenderMinimal
{
    use BasicEnum;

    /**
     * @return self[]
     */
    protected static function init()
    {
        return [
            'MALE' => new self('Male'),
            'FEMALE' => new self('Female'),
        ];
    }

    /** @var string */
    private $title;

    /**
     * Private constructor avoids external creation of the instances.
     * @param string $title Title
     */
    private function __construct($title)
    {
        $this->title = $title;
    }

    /**
     * @return self
     */
    public static function MALE()
    {
        return self::values()['MALE'];
    }

    /**
     * @return self
     */
    public static function FEMALE()
    {
        return self::values()['FEMALE'];
    }

    /**
     * @return string
     */
    public function getTitle(): string
    {
        return $this->title;
    }
}
```

Some ways of usage:

```
class UsageSample
{
    public function minimalisticSample()
    {
        // creating pointers
        $male = GenderMinimal::MALE();
        $female = GenderMinimal::FEMALE();

        // passing as method argument
        self::assert(self::greeting($male) === 'Mr.');
        self::assert(self::greeting($female) === 'Ms./Mrs.');

        // comparing pointers
        self::assert($male !== $female);
        self::assert($female === GenderMinimal::FEMALE());

        // iterating over the values with type hinting
        foreach (GenderMinimal::values() as $value) {
            self::assert(in_array($value->getTitle(), ['Male', 'Female']));
        }

        return $this;
    }

    public function primaryKeySample()
    {
        // imitating reading from storage
        function dummyFetch(): GenderWithPrimaryKey {
            // dummy calculation of referenced id
            $ref = (1 + 1) / 2;
            return GenderWithPrimaryKey::find($ref);
        }
        $gender = dummyFetch();
        self::assert($gender->getTitle() === 'Male');

        // imitating persisting in storage
        function dummyPersist(GenderWithPrimaryKey $gender) {
            return $gender->getPk();
        }
        $persistedRef = dummyPersist(GenderWithPrimaryKey::MALE());
        self::assert($persistedRef === 1);

        return $this;
    }

    public function helperMethodsSample()
    {
        // dynamic pointers
        $male = GenderWithHelpers::findByTitle('male');
        $female = GenderWithHelpers::findByShortCode('f');

        // calling helper methods
        self::assert($male->isMale());
        self::assert($female->isFemale());

        return $this;
    }

    public function polymorphicSample()
    {
        // the pointer of extended class is not strictly equal to base class pointer
        self::assert(GenderPolymorphicBase::MALE() !== GenderPolymorphicBaseExt::MALE());
        self::assert(GenderPolymorphicBase::FEMALE() !== GenderPolymorphicBaseExt::FEMALE());

        /// but they do hold equal data
        self::assert(GenderPolymorphicBase::MALE()->getTitle() === GenderPolymorphicBaseExt::MALE()->getTitle());
        self::assert(GenderPolymorphicBase::FEMALE()->getTitle() === GenderPolymorphicBaseExt::FEMALE()->getTitle());

        // calling base methods from child class
        foreach (GenderPolymorphicBaseExt::getHumans() as $human) {
            self::assert(in_array($human->getTitle(), ['Male', 'Female']));
        }

        // passing as method argument
        self::assert(self::polymorphicGreeting(GenderPolymorphicImpl::ALIEN()) === 'Welcome to Earth!');

        return $this;
    }

    /**
     * @param GenderMinimal $gender
     * @return string
     */
    private static function greeting(GenderMinimal $gender)
    {
        // using in switch cases
        switch ($gender) {
            case GenderMinimal::MALE():
                return 'Mr.';
            case GenderMinimal::FEMALE():
                return 'Ms./Mrs.';
        }
        throw new \LogicException('Unhandled Gender constant');
    }

    /**
     * @param GenderPolymorphicInterface $gender
     * @return string
     */
    private static function polymorphicGreeting(GenderPolymorphicInterface $gender)
    {
        if (in_array($gender->getTitle(), ['Male', 'Female'])) {
            return 'Hello!';
        } else {
            return 'Welcome to Earth!';
        }
    }

    /**
     * @param bool $assertion
     */
    private static function assert(bool $assertion)
    {
        if (!$assertion) {
            throw new \LogicException('Something went wrong');
        }
    }
}
```

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

3088d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5fde72f9e6bddf775739f92da2d2c0048cf9aaa2a6d42085c77a65299c356efb?d=identicon)[kugaudo](/maintainers/kugaudo)

### Embed Badge

![Health badge](/badges/kugaudo-php-enum/health.svg)

```
[![Health](https://phpackages.com/badges/kugaudo-php-enum/health.svg)](https://phpackages.com/packages/kugaudo-php-enum)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
