Aufzählungen in PHP

Lesezeit: 4 Minuten

Aufzahlungen in PHP
Henrik Paul

Ich weiß, dass PHP noch keine nativen Enumerationen hat. Aber ich habe mich aus der Java-Welt an sie gewöhnt. Ich würde Enums gerne verwenden, um vordefinierte Werte anzugeben, die die Autovervollständigungsfunktionen von IDEs verstehen könnten.

Konstanten machen den Trick, aber es gibt das Problem der Namespace-Kollision und (oder eigentlich da) Sie sind global. Arrays haben kein Namespace-Problem, aber sie sind zu vage, sie können zur Laufzeit überschrieben werden und IDEs wissen selten, wie sie ihre Schlüssel ohne zusätzliche statische Analyseanmerkungen oder -attribute automatisch füllen können.

Gibt es Lösungen/Workarounds, die Sie häufig verwenden? Erinnert sich jemand, ob die PHP-Jungs irgendwelche Gedanken oder Entscheidungen bezüglich Aufzählungen hatten?

  • it.toolbox.com/blogs/macsploitation/…

    – Pbohne

    5. Juni 2009 um 11:25 Uhr

  • Ich habe eine Workaround-Funktion erstellt, die Konstanten als bitweise aufzählt oder nicht. Ich habe nicht bemerkt, dass Sie das vorher gefragt haben, aber ich habe hier eine bessere Lösung als Klassenvariablen: stackoverflow.com/questions/3836385/…

    – NoodleOfDeath

    6. April 2013 um 21:41 Uhr

  • github.com/myclabs/php-enum

    – Matthieu Napoli

    5. Juli 2014 um 15:07 Uhr

  • Ich habe kürzlich eine einfache Bibliothek für PHP-Enums entwickelt: github.com/dnl-blkv/simple-php-enum Zum Zeitpunkt des Schreibens dieser Antwort befindet sie sich noch in der Vorabversionsphase, ist jedoch bereits voll funktionsfähig, gut dokumentiert und auf Packagist veröffentlicht. Dies könnte eine praktische Option sein, wenn Sie nach einfach zu implementierenden Enumerationen suchen, die denen von C/C++ ähneln.

    – dnl-blkv

    30. März 2017 um 20:10 Uhr

  • Die native Unterstützung von Aufzählungen in PHP wird mit der Version verfügbar sein 8.1 voraussichtlich im November 2021 erscheinen. Es sieht wie folgt aus: enum Status { case started; case stopped; case paused; }

    – Abdul Rahman Kayali

    11. August 2021 um 10:45 Uhr


Es gibt auch eine native Erweiterung. Die SplEnum

SplEnum bietet die Möglichkeit, Aufzählungsobjekte nativ in PHP zu emulieren und zu erstellen.

http://www.php.net/manual/en/class.splenum.php

Aufmerksamkeit:

https://www.php.net/manual/en/spl-types.installation.php

Die PECL-Erweiterung ist nicht mit PHP gebündelt.

Eine DLL für diese PECL-Erweiterung ist derzeit nicht verfügbar.

  • Hier ist ein Beispiel mit Splenum: dreamincode.net/forums/topic/201638-enum-in-php

    – Nordes

    6. April 2011 um 12:00 Uhr

  • Ich habe einen Rollback gemacht, ich mag es besser, wenn ich den Link sehen kann. Es gibt mir Kontextinformationen.

    – Markus

    26. Juli 2011 um 21:58 Uhr

  • Ich rollte wieder zurück. Ich möchte nicht, dass ihr den Link bearbeitet.

    – Markus

    27. Februar 2014 um 20:58 Uhr

  • Seien Sie vorsichtig, wenn Sie dies verwenden. SPL-Typen sind experimentell: “Diese Erweiterung ist EXPERIMENTELL. Das Verhalten dieser Erweiterung, einschließlich der Namen ihrer Funktionen und jeglicher anderer Dokumentation rund um diese Erweiterung, kann sich ohne Vorankündigung in einer zukünftigen Version von PHP ändern. Diese Erweiterung sollte auf eigene Gefahr verwendet werden.”

    – bzeaman

    17. Juni 2016 um 13:05 Uhr

  • SplEnum ist nicht mit PHP gebündelt, es braucht SPL_Types-Erweiterung

    – Kwadz

    21. Dezember 2016 um 10:26 Uhr


Was ist mit Klassenkonstanten?

<?php

class YourClass
{
    const SOME_CONSTANT = 1;

    public function echoConstant()
    {
        echo self::SOME_CONSTANT;
    }
}

echo YourClass::SOME_CONSTANT;

$c = new YourClass;
$c->echoConstant();

  • echoConstant kann ersetzt werden durch __toString. Und dann einfach echo $c

    – Justinas

    28. April 2020 um 9:56 Uhr

Aufzahlungen in PHP
Yeroon

Ich habe Klassen mit Konstanten verwendet:

class Enum {
    const NAME       = 'aaaa';
    const SOME_VALUE = 'bbbb';
}

print Enum::NAME;

  • echoConstant kann ersetzt werden durch __toString. Und dann einfach echo $c

    – Justinas

    28. April 2020 um 9:56 Uhr

Aufzahlungen in PHP
M. Reza

Die oberste Antwort oben ist fantastisch. Wenn Sie jedoch extend Es auf zwei verschiedene Arten, dann führt die zuerst durchgeführte Erweiterung zu einem Aufruf der Funktionen, die den Cache erstellen. Dieser Cache wird dann von allen nachfolgenden Anrufen verwendet, egal von welcher Nebenstelle die Anrufe initiiert werden …

Um dies zu lösen, ersetzen Sie die Variable und die erste Funktion durch:

private static $constCacheArray = null;

private static function getConstants() {
    if (self::$constCacheArray === null) self::$constCacheArray = array();

    $calledClass = get_called_class();
    if (!array_key_exists($calledClass, self::$constCacheArray)) {
        $reflect = new \ReflectionClass($calledClass);
        self::$constCacheArray[$calledClass] = $reflect->getConstants();
    }

    return self::$constCacheArray[$calledClass];
}

  • Hatte genau dieses Problem. Brian oder jemand mit Bearbeitungsrechten sollte es in der akzeptierten Antwort ansprechen. Ich habe es in meinem Code gelöst, indem ich die Methode „static::“ anstelle von „self::“ in der Funktion getConstants() verwendet und den $constCache in den untergeordneten Aufzählungen neu deklariert habe.

    – Sp3igel

    18. August 2014 um 23:47 Uhr

  • Es mag nicht sexy sein, aber die Verwendung einer Schnittstellenkonstanten ist möglicherweise der beste Weg in PHP.

    – Anthony Rutledge

    11. September 2018 um 4:03 Uhr

988300cookie-checkAufzählungen in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy