2012-01-25 39 views
6

Possible Duplicate:
Workaround for basic syntax not being parsedKết hợp cờ bit trong một lớp liên tục PHP

Tôi cố gắng để cho phép các nhà phát triển để xác định bất kỳ sự kết hợp của các bit để xác định các mẩu dữ liệu họ muốn đưa vào một phản ứng.

class ClassName { 
      const BUILD_DATE_RFC = 1; 
      const BUILD_DATE_SQL = 2; 
      const BUILD_DATE_SQLTIME = 4; 
      const BUILD_DATE_UNIX = 8; 

      // .... 
    } 

này hoạt động theo nghĩa là khi tôi nhanh chóng lớp như thế này:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL); 

Logic này sẽ được thực hiện:

if (self::BUILD_DATE_RFC & $this->metaBits) { 
     $dateMeta['RFC'] = date('r'); 
    } 
    if (self::BUILD_DATE_SQL & $this->metaBits) { 
     $dateMeta['SQL'] = date('Y-m-d'); 
    } 
    if (self::BUILD_DATE_SQLTIME & $this->metaBits) { 
     $dateMeta['SQL_time'] = date('Y-m-d H:i:s'); 
    } 

Tất cả điều này làm việc tuyệt vời, ngoại trừ tôi d muốn xác định 'bit shortcut' giống như BUILD_DATE_ALL sẽ là giá trị của tổng của tất cả các bit liên quan đến DATE, vì vậy chúng chỉ phải chỉ định hằng số phím tắt thay vì mỗi ký tự riêng lẻ.

tôi đã cố gắng này, nhưng nó ném một lỗi:

const BUILD_DATE_ALL = (self::BUILD_DATE_RFC|self::BUILD_DATE_SQL|self::BUILD_DATE_SQLTIME|self::BUILD_DATE_UNIX); 

Tôi cũng đã cố gắng khác nhau cách tiếp cận/cú pháp:

const BUILD_REQUEST_ALL = self::BUILD_IP | 
       self::BUILD_USERAGENT | 
       self::BUILD_REFERER; 

và cách tiếp cận khác tôi đã cố gắng:

const BUILD_DEFAULT = self::BUILD_DATE_ALL|self::BUILD_REQUEST_ALL^self::BUILD_REFERER^self::BUILD_USERAGENT; 

Các lỗi Tôi nhận được:

ErrorException: syntax error, unexpected '('

và lỗi tôi nhận được cho các cách tiếp cận khác là:

ErrorException: syntax error, unexpected '|', expecting ',' or ';'

Dường như PHP không muốn tính toán quá nhiều trong một định nghĩa không đổi và chỉ muốn có một giá trị duy nhất chứ không phải là giá trị có nguồn gốc. Tôi giả định điều này dựa trên thực tế là nó không muốn dấu ngoặc đơn cũng không muốn | để tính toán thêm. Ngoài ra, tôi đã thử sử dụng '-' thay vì | chỉ để kiểm tra lý thuyết của tôi .. và vâng, nó phàn nàn về việc + bị bất ngờ quá.

Làm cách nào để khắc phục sự cố để tôi có thể xác định 'bit lối tắt' là tổng của một loạt các hằng số đã được xác định khác.

+0

Bạn cần xác định hằng số đó bằng giá trị số đơn giản (tự thêm chính cờ). – mario

+0

Từ [tài liệu] (http://php.net/manual/en/language.oop5.constants.php), hỗ trợ biểu thức liên tục đã được thêm vào trong PHP 5.6.0. Vì vậy, cách tiếp cận ban đầu của bạn sau đây sẽ không ném một lỗi. 'const BUILD_DATE_ALL = (tự :: BUILD_DATE_RFC | tự :: BUILD_DATE_SQL | tự :: BUILD_DATE_SQLTIME | self :: BUILD_DATE_UNIX); ' – GreeKatrina

Trả lời

6

Bạn có thể tự tính toán nó. Vì đây là những cờ bit có một mẫu.

class ClassName { 
     const BUILD_DATE_RFC = 1; 
     const BUILD_DATE_SQL = 2; 
     const BUILD_DATE_SQLTIME = 4; 
     const BUILD_DATE_UNIX = 8; 
     const BUILD_DATE_ALL = 15; // 15 = 1|2|4|8; 
     // .... 
} 
+1

Loại khó chịu vì tôi muốn hiển thị các bit thực sự được bao gồm để một dev khác có thể nhìn vào nó và tìm ra, nhưng đó là những gì bình luận cho.Cách giải quyết này là những gì tôi sẽ thực hiện. Cảm ơn! – WhiskeyTangoFoxtrot

+8

Nếu bạn đặt 'BUILD_DATE_ALL = -1' thì bạn sẽ không cần phải làm việc, bởi vì' -1' đặt tất cả bit thành 1 anyway. Thực hành tốt nhất cho một lá cờ TẤT CẢ. – worldofjr

1

trích dẫn từ hướng dẫn:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

sử dụng | toán tử là kết quả của một phép toán, do đó không được pemitted

+1

thật không may là PHP chỉ cho phép nguyên thủy. Điều này có xảy ra với các ngôn ngữ khác không? – WhiskeyTangoFoxtrot

Các vấn đề liên quan