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?

Vikmalhotra
quelle

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");
Don Vaughn
quelle
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
Dado
quelle