2011-01-19 33 views
36

Khi suy yếu tố của PHP chuỗi lập chỉ mục mảng (5.3.3, Win32) các hành vi sau đây có thể được mong đợi hay không:Interpolation (đôi chuỗi trích dẫn) của Associative Arrays trong PHP

$ha = array('key1' => 'Hello to me'); 

print $ha['key1']; # correct (usual way) 
print $ha[key1];  # Warning, works (use of undefined constant) 

print "He said {$ha['key1']}"; # correct (usual way) 
print "He said {$ha[key1]}"; # Warning, works (use of undefined constant) 

print "He said $ha['key1']"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE 
print "He said $ha[ key1 ]"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE 
print "He said $ha[key1]";  # !! correct (How Comes?) 

Inerestingly, sự dòng cuối cùng có vẻ là mã PHP chính xác. Bất kỳ lời giải thích? Tính năng này có đáng tin cậy không?


Chỉnh sửa: Điểm của bài đăng hiện được đặt trong mặt đậm để giảm hiểu lầm.

Trả lời

38

Có, bạn có thể tin tưởng điều đó. All ways of interpolation a variable are covered in the documentation khá tốt.

Nếu bạn muốn có lý do tại sao điều này được thực hiện như vậy, tốt, tôi không thể giúp bạn ở đó. Nhưng như mọi khi: PHP là cũ và đã phát triển rất nhiều, do đó giới thiệu cú pháp không phù hợp.

+0

@nikic, tôi không thể tìm thấy trường hợp này chính xác (w/o dấu ngoặc nhọn) trong tài liệu, mà là nó ? Cảm ơn, rbo –

+0

@mario: Cá nhân tôi nghĩ rằng nó không tốt, nhưng nhiều người khác có lẽ không sao với nó -> Bỏ phần đó. – NikiC

+0

@rubber boots: tìm ra dòng này: "echo" Anh ấy uống một ít nước ép [koolaid1]. "PHP_EOL;'. – NikiC

8

Trường hợp cuối cùng là trường hợp đặc biệt được trình mã thông báo PHP xử lý. Nó không tra cứu nếu bất kỳ hằng số nào được đặt tên đã được định nghĩa, nó luôn luôn giả sử một chuỗi ký tự để tương thích với PHP3 và PHP4.

+4

Chỉ dành cho những người quan tâm (có lẽ không ai ...): PHP sẽ tạo một 'T_STRING' cho chỉ mục mảng (hoặc' T_NUM_STRING' nếu nó là số thập phân không tràn) thay vì 'T_CONSTANT_ENCAPSED_STRING' bình thường. – NikiC

9

Có, đây là hành vi được xác định rõ ràng và sẽ luôn tìm kiếm khóa chuỗi 'key' và không phải giá trị của hằng số (có thể không xác định) key.

Ví dụ, hãy xem xét đoạn mã sau:

$arr = array('key' => 'val'); 
define('key', 'defined constant'); 
echo "\$arr[key] within string is: $arr[key]"; 

này đầu ra sẽ như sau:

$arr[key] within string is: val 

Điều đó nói rằng, nó có thể không thực hành tốt nhất để viết mã như thế này, và thay vào đó một trong hai sử dụng :

$string = "foo {$arr['key']}" 

hoặc

$string = 'foo ' . $arr['key'] 

cú pháp.

0

Để trả lời câu hỏi của bạn, vâng, vâng nó có thể, và giống như nổ tung và phát nổ, php là rất rất khoan dung ... do đó mâu thuẫn rất nhiều

Và tôi phải nói rằng tôi giống như suy PHP cho đấm daisy basical Sau đó, nếu bạn chỉ làm nội suy biến chuỗi bằng cách sử dụng một đối tượng của mảng đơn, có thể dễ dàng hơn để viết mẫu mà bạn có thể in một biến đối tượng cụ thể vào (như trong javascript hoặc python).) và do đó kiểm soát rõ ràng phạm vi biến và đối tượng đang được áp dụng cho chuỗi

tôi mặc dù isprintf của anh chàng này thực sự hữu ích cho các loại hình điều

http://www.frenck.nl/2013/06/string-interpolation-in-php.html

<?php 

$values = array(
    'who' => 'me honey and me', 
    'where' => 'Underneath the mango tree', 
    'what' => 'moon', 
); 

echo isprintf('%(where)s, %(who)s can watch for the %(what)s', $values); 

// Outputs: Underneath the mango tree, me honey and me can watch for the moon 
+1

Liên kết báo cáo lỗi 404 – fpierrat

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