2010-10-22 18 views
54

Estoy tratando de crear un nombre de constante de forma dinámica y luego obtener el valor.Nombre de la constante dinámica en 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; 

pero me parece que el valor constante de $ todavía contiene el nombre de la constante, y no el valor.

Intenté el segundo nivel de indirección también $$constant_name Pero eso lo convertiría en una variable no una constante.

¿Alguien puede arrojar algo de luz sobre esto?

Respuesta

45

Y para demostrar que esto funciona con constantes de clase también:

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

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

A tener en cuenta que puede que tenga que especificar el nombre de clase totalmente calificado (espacio de nombre) si la constante está en una clase que no está en el espacio de nombre actual, independientemente de si ha agregado un "uso" para la clase en su archivo. – lopsided

+1

Esta respuesta es excelente por el buen ejemplo. Eso es exactamente lo que estaba buscando :) ¡Gracias! – ElChupacabra

+2

@lopsided La constante ':: class' se puede usar para recuperar el espacio de nombres completamente calificado, por ejemplo:' constant (YourClass :: class. ':: CONSTANT_'. $ YourVariable); ' –

5

de usar nombres de constantes dinámicas en su clase puede utilizar la función de reflexión (desde PHP5):

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

Por ejemplo: i f desea filtrar solamente las constantes específicas (SORT_ *) en la clase

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

resultado:

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