2010-10-22 39 views
54

Tôi đang cố gắng tạo một tên liên tục động và sau đó lấy giá trị.Tên hằng số động trong 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; 

Nhưng tôi thấy rằng giá trị hằng số $ vẫn chứa NAME của hằng số chứ không phải giá trị VALUE.

Tôi đã thử mức thứ hai của sự không đồng ý cũng như $$constant_name Nhưng điều đó sẽ biến nó thành một biến không phải là hằng số.

Ai đó có thể ném ánh sáng lên điều này?

Trả lời

45

Và để chứng minh rằng điều này làm việc với các hằng số lớp quá:

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

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

Cần lưu ý rằng bạn có thể cần phải xác định tên lớp hoàn toàn đủ điều kiện (tên không gian) nếu hằng số nằm trong một lớp không nằm trong không gian tên hiện tại - bất kể bạn đã thêm "sử dụng" cho lớp trong tệp của mình hay chưa. – lopsided

+1

Câu trả lời này là rất tốt vì ví dụ tốt. Đó chính xác là những gì tôi đang tìm kiếm :) Cảm ơn! – ElChupacabra

+2

@lopsided Hằng số ':: class' có thể được sử dụng để lấy ra không gian tên đầy đủ, ví dụ:' constant (YourClass :: class. ':: CONSTANT_'. $ YourVariable); ' –

5

Để sử dụng tên liên tục năng động trong lớp học của bạn, bạn có thể sử dụng tính năng phản xạ (kể từ php5):

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

Ví dụ: i f bạn muốn lọc chỉ cụ thể (SORT_ *) hằng trong lớp

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

kết quả:

array (size=2) 
    0 => int 1 
    1 => int 2 
Các vấn đề liên quan