Wie bekomme ich den Namen der Konstante?

Lesezeit: 4 Minuten

Angenommen, Sie haben eine Konstante in einer Klasse definiert:

class Foo {
    const ERR_SOME_CONST = 6001;

    function bar() {
        $x = 6001;
        // need to get 'ERR_SOME_CONST'
    }
}

Ist es mit PHP möglich?

Benutzer-Avatar
Jan Hancic

Du bekommst sie mit Reflexions-API

Ich gehe davon aus, dass Sie den Namen der Konstante basierend auf dem Wert Ihrer Variablen erhalten möchten (Wert der Variablen == Wert der Konstante). Holen Sie sich alle in der Klasse definierten Konstanten, durchlaufen Sie sie und vergleichen Sie die Werte dieser Konstanten mit dem Wert Ihrer Variablen. Beachten Sie, dass Sie bei diesem Ansatz möglicherweise eine andere Konstante als die gewünschte erhalten, wenn es zwei Konstanten mit demselben Wert gibt.

Beispiel:

class Foo {
    const ERR_SOME_CONST = 6001;
    const ERR_SOME_OTHER_CONST = 5001;

    function bar() {
        $x = 6001;
        $fooClass = new ReflectionClass ( 'Foo' );
        $constants = $fooClass->getConstants();

        $constName = null;
        foreach ( $constants as $name => $value )
        {
            if ( $value == $x )
            {
                $constName = $name;
                break;
            }
        }

        echo $constName;
    }
}

ps: Können Sie sagen, warum Sie das brauchen, da es sehr ungewöhnlich erscheint …

  • Eigentlich nichts Ernstes. Denken Sie nur an die Möglichkeit, den Fehlercode von der Klassenfunktion zu übergeben. Da für mich const ERR_SOME_ERROR=’ERR_SOME_ERROR’ seltsam aussieht, dachte ich, dass meine Funktion getLastError() so etwas wie array(5003=>’ERR_SOME_ERROR’,5002=>’ERR_SOME_ERR2′) und so weiter zurückgeben könnte. Nur um Fehlercode und Fehlername zurückzugeben. Nun, je mehr ich darüber nachdenke, werde ich es wahrscheinlich nicht verwenden (für die ungewöhnliche Syntax, wie Sie sagten) 🙂

    – Deniss Koslows

    10. Dezember 2009 um 11:09 Uhr

  • brauchte es auch für CURLE_* ständige Unterstützung, wo curl_multi_strerror war nicht vorhanden

    – Timo Huovinen

    3. Oktober 2013 um 8:36 Uhr

  • Ich “brauche” so etwas, um eine schönere Fehlerausgabe bereitzustellen, ohne neu schreiben zu müssen, wie wir bestimmte Fehlercodes verfolgen, die als Konstanten gespeichert sind.

    – Frug

    21. April 2015 um 14:30 Uhr

Benutzer-Avatar
Todeskaiser

Hier ist, was ich getan habe, um es zu erreichen. Inspiriert von Jan Hancic.

class ErrorCode
{
    const COMMENT_NEWCOMMENT_DISABLED = -4;
    const COMMENT_TIMEBETWEENPOST_ERROR = -3;
    /**
     * Get error message of a value. It's actually the constant's name
     * @param integer $value
     * 
     * @return string
     */
    public static function getErrorMessage($value)
    {
        $class = new ReflectionClass(__CLASS__);
        $constants = array_flip($class->getConstants());

        return $constants[$value];
    }
}

  • Ich möchte nur sagen, dass dies nicht funktioniert, wenn Konstanten denselben Wert haben. Sollte meistens kein Problem sein, aber ja…

    – Populus

    24. Juni 2014 um 20:20 Uhr

  • Ich denke, das würde nicht funktionieren, wenn eine Konstante auch ein Array als Wert hat.

    – DrKey

    4. Juli 2019 um 9:33 Uhr

Mit Reflexion:

$class = new ReflectionClass("Foo");
$constants = $class->getConstants();

$constants ist ein Array, das alle Namen und Werte der in der Klasse Foo definierten Konstanten enthält.

Alle anderen Antworten decken die wesentlichen Punkte ab. Aber wenn verrückte Einzeiler dein Ding sind, dann:

function getConstantName($class, $value)
{
    return array_flip((new \ReflectionClass($class))->getConstants())[$value];
}

Wenn Sie den Fall behandeln müssen, in dem der Wert möglicherweise keine der Konstanten ist, können Sie auf eine zusätzliche Zeile verzichten:

function getConstantName($class, $value)
{
    $map = array_flip((new \ReflectionClass($class))->getConstants());
    return (array_key_exists($value, $map) ? $map[$value] : null);
}

Ich weiß, dass dies eine alte Frage ist, aber ich habe immer noch das Gefühl, dass ich einige nützliche Beiträge habe. Ich habe dies mit einer abstrakten Klasse implementiert, die alle meine Aufzählungen erweitern. Die abstrakte Klasse enthält eine generische toString()-Methode;

abstract class BaseEnum{
    private final function __construct(){ }

    public static function toString($val){
        $tmp = new ReflectionClass(get_called_class());
        $a = $tmp->getConstants();
        $b = array_flip($a);

        return ucfirst(strtolower($b[$val]));
    }
}

//actual enum
final class UserType extends BaseEnum {
    const ADMIN = 10;
    const USER = 5;
    const VIEWER = 0;
}

Auf diese Weise können Sie eine für Menschen lesbare Zeichenfolge erhalten, die in der Ausgabe für jede Aufzählung verwendet werden kann, die die Basisaufzählung erweitert. Darüber hinaus ist Ihre Implementierung der Aufzählung, Being finalkann nicht erweitert werden und da der Konstruktor in der BaseEnum ist private es kann niemals instanziiert werden.

Wenn Sie beispielsweise eine Liste aller Benutzernamen mit ihren Typen anzeigen, können Sie so etwas tun wie

foreach($users as $user){
    echo "<li>{$user->name}, ".UserType::toString($user->usertype)."</li>";
}

Benutzer-Avatar
Gottlieb Notschnabel

Alle Konstanten können mit dieser Funktion einem Array zugewiesen werden.

$const = get_defined_constants();

dann können Sie mit der folgenden Funktion die Array-Struktur drucken

echo "&lt;pre&gt;";

print_r($const);

und Sie können hier weitere Erklärungen sehen www.sugunan.com

Benutzer-Avatar
Jave

Warnung: Auf diese Weise sollten Sie NICHT programmieren … (wenn Sie sich nicht sicher sind, was Sie tun 🙂 )

Ich habe 1 Zeile geschrieben, die Konstanten und ihre numerischen Werte nach Ihrer Wahl von CATEGORY_ widerspiegelt

Hier ist also die Liste von CATEGORY_ ERR_

foreach(get_defined_constants() as $key => $value) if(strlen($key)>5) if(substr($key, 0,5)=="ERR_") echo"<br>Found an php ERR_ constant! : ".$key."=>".$value;

Und wenn Sie nur nach der Nummer suchen möchten, nach der Sie suchen => ich habe eine 1-Zeilen-Funktion erstellt:

//input parameters: CATEGORYNAME_ , #constantNumber
function getConstantName($category,$constantNumber){foreach(get_defined_constants() as $key => $value) if(strlen($key)>strlen($category)) if(substr($key, 0,strlen($category))==$category) if($value==$constantNumber) return $key; return "No constant found.";}

Also zum Beispiel eine Info-Konstante mit der Nummer 64:

echo "NameOfConstant: ".getConstantName("INFO_",64);

wird so etwas ausgeben: NameOfConstant: INFO_LICENSE

1335680cookie-checkWie bekomme ich den Namen der Konstante?

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

Privacy policy