Name der dynamischen Konstante in PHP


79

Ich versuche, einen konstanten Namen dynamisch zu erstellen und dann zum Wert zu gelangen.

define( CONSTANT_1 , "Some value" ) ;

// try to use it dynamically ...
$constant_number = 1 ;
$constant_name = ("CONSTANT_" . $constant_number) ;

// try to assign the constant value to a variable...
$constant_value = $constant_name;

Aber ich finde, dass der Wert der $ Konstante immer noch den NAMEN der Konstante enthält und nicht den WERT.

Ich habe auch die zweite Indirektionsebene ausprobiert. $$constant_nameAber das würde es zu einer Variablen und nicht zu einer Konstanten machen.

Kann jemand etwas Licht darauf werfen?

Antworten:



71

Und um zu demonstrieren, dass dies auch mit Klassenkonstanten funktioniert:

class Joshua {
    const SAY_HELLO = "Hello, World";
}

$command = "HELLO";
echo constant("Joshua::SAY_$command");

10
Beachten Sie, dass Sie möglicherweise den vollständig qualifizierten Klassennamen (mit Namespace) angeben müssen, wenn sich die Konstante in einer Klasse befindet, die sich nicht im aktuellen Namespace befindet - unabhängig davon, ob Sie der Klasse in Ihrer Datei eine "Verwendung" hinzugefügt haben.
schief

1
Diese Antwort ist wegen des guten Beispiels großartig. Genau das habe ich gesucht :) Danke!
ElChupacabra

6
@lopsided Die ::classKonstante kann verwendet werden, um den vollständig qualifizierten Namespace abzurufen, zum Beispiel:constant(YourClass::class . '::CONSTANT_' . $yourVariable);
Willem-Aart

1
Beachten Sie, dass das ::classSchlüsselwort seit PHP 5.5
T30

9

Um dynamische Konstantennamen in Ihrer Klasse zu verwenden, können Sie die Reflexionsfunktion verwenden (seit PHP5):

$thisClass = new ReflectionClass(__CLASS__);
$thisClass->getConstant($constName);

Beispiel: Wenn Sie nur bestimmte (SORT_ *) Konstanten in der Klasse filtern möchten

class MyClass 
{
    const SORT_RELEVANCE = 1;
    const SORT_STARTDATE = 2;

    const DISTANCE_DEFAULT = 20;

    public static function getAvailableSortDirections()
    {
        $thisClass = new ReflectionClass(__CLASS__);
        $classConstants = array_keys($thisClass->getConstants());

        $sortDirections = [];
        foreach ($classConstants as $constName) {
            if (0 === strpos($constName, 'SORT_')) {
                $sortDirections[] =  $thisClass->getConstant($constName);
            }
        }

        return $sortDirections;
    }
}

var_dump(MyClass::getAvailableSortDirections());

Ergebnis:

array (size=2)
  0 => int 1
  1 => int 2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.