2010-10-22 20 views
54

Sto cercando di creare un nome costante in modo dinamico e quindi ottenere il valore.Nome costante dinamico in PHP

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; 

Ma trovo che il valore costante $ contenga ancora il NOME della costante e non il VALORE.

Ho provato anche il secondo livello di riferimento indiretto $$constant_name Ma ciò renderebbe una variabile non costante.

Qualcuno può far luce su questo?

risposta

45

E per dimostrare che questo funziona con costanti di classe anche:

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

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

Da segnalare che potrebbe essere necessario specificare il nome di classe completo (con lo spazio dei nomi) se la costante si trova in una classe che non si trova nello spazio dei nomi corrente, indipendentemente dal fatto che sia stato aggiunto un "uso" per la classe nel file. – lopsided

+1

Questa risposta è eccezionale a causa del buon esempio. Questo è esattamente quello che stavo cercando :) Grazie! – ElChupacabra

+2

@lopsided La costante ':: class' può essere utilizzata per recuperare lo spazio dei nomi completo, ad esempio' costante (YourClass :: class. ':: CONSTANT_'. $ YourVariable); ' –

5

utilizzare nomi costanti dinamiche nella tua classe è possibile utilizzare la funzione di riflessione (dal PHP5):

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

Ad esempio: i f si desidera filtrare solo specifico (SORT_ *) le costanti nella classe

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()); 

risultato:

array (size=2) 
    0 => int 1 
    1 => int 2