2010-10-22 15 views
54

Dinamik olarak sabit bir ad oluşturmaya çalışıyorum ve sonra da değere ulaşıyorum.PHP'de dinamik sabit ad

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; 

Ancak, $ sabit değerinin hala sabitin NAME değerini içerdiğini buldum, VALUE'yi değil.

$$constant_name'un da ikinci düzeydeki indirmeyi denedim, ancak bu değişkeni sabit olmayan bir değişken yapar.

Birisi buna ışık tutabilir mi?

cevap

45

Ve bu da sınıf sabitleri ile çalıştığını göstermek için:

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

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

Dosyanızdaki sınıfa bir "kullanım" eklemiş olursanız, sabit, geçerli ad alanında olmayan bir sınıftaysa, tam nitelikli (adlandırılmış) sınıf adı. – lopsided

+1

Bu cevap, iyi örnek olması nedeniyle harika. Tam olarak aradığım şey budur :) Teşekkürler! – ElChupacabra

+2

@lopsided Tam olarak adlandırılmış ad alanını almak için ':: class' sabiti kullanılabilir, örneğin: 'sabit (YourClass :: class.' :: CONSTANT_ '. $ YourVariable);' –

5

sen (php5 beri) yansıma özelliğini kullanabilirsiniz Sınıfındaki dinamik sabit isimlerini kullanmak için:

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

Örneğin: i f sınıftaki tek özel (SORT_ *) sabitleri filtre uygulamak istediğiniz

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

sonucu:

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