2009-08-12 45 views
21

Làm thế nào tôi có thể nhận PHP để đánh giá biến tĩnh trong dấu ngoặc kép?Biến tĩnh PHP trong dấu ngoặc kép

tôi muốn làm một cái gì đó như thế này:

log("self::$CLASS $METHOD entering"); 

Tôi đã thử tất cả các loại {} combo để có được giá trị biến tự :: $ CLASS, nhưng không có tác dụng. Tôi hiện đã ổn định với chuỗi nối nhưng nó là một nỗi đau để gõ:

log(self::$CLASS . " $METHOD entering"); 
+6

log (. Tự :: $ CLASS "$ PHƯƠNG PHÁP nhập"); là MỘT ký tự phụ để nhập thay vì nhật ký ("tự :: $ CLASS $ METHOD nhập"); .. đây là một nỗi đau? –

+1

Nó không phải là xấu, nhưng một trong những khác là hơi dễ dàng hơn để đọc và gõ. :) Tôi đã chỉ tự hỏi nếu có một thay thế nếu bạn không quan tâm đến việc tối ưu hóa. – Chris

+4

@Scott: Discouragement không phải là câu trả lời – cmc

Trả lời

16

Rất tiếc, bạn không thể làm điều đó. Nó chỉ hoạt động cho các biểu thức đơn giản. Xem here.

+0

"Vì {không thể thoát, cú pháp này sẽ chỉ được nhận ra khi $ ngay sau {." Nếu tôi hiểu chính xác điều này, "{self :: $ METHOD}" sẽ không hoạt động vì ký tự $ phải trực tiếp theo dấu ngoặc nhọn bên trái. – Chris

3

Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng bạn có thể hiển thị tên lớp và phương pháp sử dụng các __METHOD__magic constant.

+0

Cảm ơn. Điều này rất hữu ích. Tôi đang chuyển từ Java và chưa có cơ hội đào sâu vào các hằng số phép thuật. Tôi sẽ sử dụng chúng thay vì định nghĩa các biến lớp và phương thức. – Chris

1

Chỉ sống với nối. You'd be surprised how inefficient variable interpolation in strings can be.

Và trong khi điều này có thể rơi vào ô của tối ưu hóa trước hoặc tối ưu hóa vi mô, tôi chỉ không nghĩ rằng bạn thực sự đạt được bất kỳ sự thanh lịch nào trong ví dụ này.

Cá nhân, nếu tôi sẽ thực hiện tối ưu hóa nhỏ hay cách khác, và lựa chọn của tôi là "nhanh hơn" và "dễ nhập hơn" - tôi sẽ chọn "nhanh hơn". Bởi vì bạn chỉ gõ nó một vài lần, nhưng nó có thể sẽ thực hiện hàng ngàn lần.

+4

Việc khuyến khích không phải là câu trả lời. – cmc

+1

Dường như permalink đó là bất cứ điều gì nhưng. –

+2

Thảo luận về nội suy chuỗi có thể vẫn không đúng: theo Rasmus Lerdorf (thông qua Twitter), đó là 1 opcode vs tmp var trade-off, và hiệu suất là tương tự. – IMSoP

-1

Có điều này có thể được thực hiện:

log("{${self::$CLASS}} $METHOD entering"); 
+0

Có, nó được cho phép, nhưng nó không đạt được hiệu quả mong muốn - nó sẽ xử lý 'self :: $ CLASS' như một tên biến; vì vậy nếu 'self :: $ CLASS == 'foo'' thì bạn sẽ kết thúc với' {$ foo} ', và không phải'' foo'' như bạn mong đợi. –

4

Đáng tiếc là không có cách nào làm thế nào để làm điều này được nêu ra. Ví dụ về một trong các câu trả lời ở đây sẽ không hoạt động, bởi vì {${self::$CLASS}} sẽ không trả lại nội dung của self::$CLASS, nhưng sẽ trả về nội dung của biến có tên trong số self::$CLASS.

Dưới đây là một ví dụ, mà không lợi nhuận myvar, nhưng aaa:

$myvar = 'aaa'; 
self::$CLASS = 'myvar'; 
echo "{${self::$CLASS}}"; 
Các vấn đề liên quan