Projectsphp-builderEnums

PHP Builder

Package

A PHP code builder for programmatically generating classes, interfaces, traits, and enums.

Enums

PhpEnum emits pure or backed enums, with optional interfaces, cases, constants, and methods.

Pure enum

Omit backedType (or pass null):

use BradieTilley\Builder\PhpEnum;
use BradieTilley\Builder\PhpEnumCase;
use BradieTilley\Builder\PhpMethod;

$enum = new PhpEnum(
    namespace: 'App\\Enums',
    name: 'Role',
    cases: [
        new PhpEnumCase(name: 'Admin'),
        new PhpEnumCase(name: 'Editor'),
        new PhpEnumCase(name: 'Viewer'),
    ],
    methods: [
        new PhpMethod(
            name: 'isStaff',
            return: 'bool',
            lines: [
                'return $this === self::Admin || $this === self::Editor;',
            ],
        ),
    ],
    description: 'Application roles',
);

echo $enum->toPhp();

Backed enum

Pass backedType as a string or PhpType ('string', 'int', etc.):

use BradieTilley\Builder\PhpAttribute;
use BradieTilley\Builder\PhpEnum;
use BradieTilley\Builder\PhpEnumCase;
use BradieTilley\Builder\PhpMethod;
use BradieTilley\Builder\Types\PhpNamedType;

$enum = new PhpEnum(
    namespace: 'App\\Enums',
    name: 'Status',
    backedType: new PhpNamedType('string'),
    implements: [
        'App\\Contracts\\Labelled',
        'JsonSerializable',
    ],
    cases: [
        new PhpEnumCase(
            name: 'Draft',
            value: "'draft'",
            attributes: [
                new PhpAttribute('App\\Attributes\\Colour', ["value: 'grey'"]),
            ],
        ),
        new PhpEnumCase(name: 'Published', value: "'published'"),
    ],
    methods: [
        new PhpMethod(
            name: 'label',
            return: 'string',
            lines: [
                'return match ($this) {',
                "    self::Draft => 'Draft',",
                "    self::Published => 'Published',",
                '};',
            ],
        ),
    ],
);

Case values are raw PHP expressions as strings (or bare ints). Quote string literals yourself: value: "'draft'" — not value: 'draft'.

Constructor options

ArgumentTypeDefaultNotes
namestring
namespacestring''
backedTypePhpType|string|nullnullPresence makes it a backed enum
implementslist<string>|string[]
caseslist<PhpEnumCase>[]
constantslist<PhpClassConstant>[]
methodslist<PhpMethod>[]Instance or static methods
attributeslist<PhpAttribute>[]
description?stringnull
templateslist<PhpTemplate|string>[]Docblock generics
strictTypesbooltrueSet false to omit the declare

Enum cases

new PhpEnumCase(
    name: 'Draft',
    value: "'draft'", // null for pure cases
    attributes: [],
);

Disabling strict types

new PhpEnum(
    name: 'Role',
    cases: [new PhpEnumCase(name: 'Admin')],
    strictTypes: false,
);

Continue to Methods & Arguments.