2010-03-08 8 views
23

Có ổn không khi sử dụng mảng không có mô phỏng đơn hoặc kép như $ array [key]? Tôi nghĩ rằng nó là xấu bởi vì PHP tìm hằng số đầu tiên nếu tôi không sử dụng báo giá đơn hoặc đôi. Một trong những đồng nghiệp của tôi nói với tôi rằng nó không quan trọng.Có ổn không khi sử dụng mảng [key] trong PHP?

Các bạn nghĩ sao?

+3

Có lẽ đồng nghiệp của bạn có nghĩa là không quan trọng việc sử dụng dấu nháy đơn hay kép? Bởi vì điều đó sẽ ít nhiều đúng (ngoại trừ các biến không được phân tích cú pháp trong các dấu nháy đơn.) –

Trả lời

42

Nó không được coi là OK - ngay cả khi nó sẽ hoạt động trong hầu hết các trường hợp.


Về cơ bản, khi PHP xem đây:

echo $array[key]; 

Nó sẽ tìm kiếm một hằng số, định nghĩa với define, gọi key - và, nếu có là không có, nếu sẽ mất giá trị 'key' .


Nhưng, nếu có cái gì đó như thế này trước đó trong mã của bạn:

define('key', 'glop'); 

Nó sẽ không mất

echo $array['key']; 

nữa; thay vào đó, nó sẽ sử dụng giá trị của key liên tục - và mã của bạn sẽ giống như:

echo $array['glop']; 


Cuối cùng, không đặt dấu ngoặc kép arround tên của key có hại cho ít nhất hai lý do:

  • có một rủi ro mà nó sẽ không làm những gì bạn mong đợi - đó là rất xấu
    • Có thể, hôm nay ...
    • Nhưng còn tuần sau/tháng/năm thì sao?
    • Có lẽ, một ngày nào đó, bạn sẽ define một hằng số với tên sai ;-)
  • Nó không tốt cho hiệu suất:
    • nó có để tìm kiếm một hằng số, trước khi sử dụng Và, như đã nói trong một nhận xét, nó tạo ra thông báo (ngay cả khi bạn tắt error_reportingdisplay_errors, các thông báo/cảnh báo/lỗi vẫn được tạo, ngay cả khi bị hủy sau)

Vì vậy, bạn không nên nghe rằng anh chàng ở điểm này: ông là sai: nó không thành vấn đề.


Và nếu bạn cần một số "bằng chứng" đó là "tốt hơn" so với những gì mọi người có thể cho bạn biết về stackoverflow, bạn có thể trỏ anh phần này của hướng dẫn, như một tài liệu tham khảo: Why is $foo[bar] wrong?

+3

Ngoài ra, mỗi khi PHP thấy cú pháp này, nó sẽ đưa ra một E_NOTICE, trong đó có một số chi phí hiệu năng. Và có thể viết một số thư rác vào nhật ký của bạn. Bởi vì bạn nên đăng nhập và giải quyết các lỗi mức thông báo. –

+3

+1 không sử dụng dấu ngoặc kép cho các khóa mảng là ngu ngốc và bị ràng buộc gây rắc rối một ngày. –

+0

@Frank: true; một lý do tốt nữa để sử dụng dấu ngoặc kép khi họ nên ở đó! –

2

Đó là bad practice không trích dẫn các giá trị quan trọng, đối với một số lý do:

  1. va chạm tiềm năng với những cái tên biểu tượng có ý nghĩa, chẳng hạn như define 'd hằng số.
  2. Một số phím không thể được biểu thị mà không trích dẫn (ví dụ: khóa "]").
  3. Thói quen xấu có thể khiến bạn khó chịu sau này (cụ thể là liên quan đến # 1 và # 2).
  4. Hiệu suất - tìm kiếm define cần có thời gian.

Nếu bạn muốn tránh nhập dấu ngoặc kép xung quanh tên chỉ là các yếu tố tiêu chuẩn của thứ bạn đang đi qua rất nhiều, có thể bạn muốn sử dụng các đối tượng thay vào đó, lấy một cú pháp object->property thay vì $array["element"] cú pháp.

2

Trừ chìa khóa thực sự là một hằng số, không có lý do gì để bạn không được đặt dấu ngoặc kép quanh khóa.

Cách thức hoạt động của PHP là tìm giá trị không đổi của những gì bạn đã đặt, nhưng phải mất biểu diễn chuỗi của nó nếu không thể tìm thấy hằng số.

Nếu ai đó chỉnh sửa mã của bạn xuống đường và thêm một hằng số với tên khóa đó, nó sẽ gây ra nhiều cơn đau đầu hơn.

6

Đây là không ổn và để thêm vào những gì người khác đã nói, nó sẽ kích hoạt một lỗi trong hầu hết các trường hợp:

8 Notice Use of undefined constant key - assumed 'key' in file: 'index.php' on line 46 

Xem phần trong PHP Manual cho "Tại sao là $ foo [thanh] sai rồi?" dưới "Mảng làm và không nên làm" trên trang này: http://php.net/manual/en/language.types.array.php

3

Từ PHP Manual - Why is $foo[bar] wrong?

Luôn luôn sử dụng dấu ngoặc kép quanh một chuỗi chỉ số mảng chữ. Ví dụ: $ foo ['bar'] là chính xác, trong khi $ foo [bar] thì không. Nhưng tại sao? Người ta thường gặp phải loại cú pháp trong các kịch bản cũ:

<?php 
$foo[bar] = 'enemy'; 
echo $foo[bar]; 
// etc 
?> 

Đây là sai, nhưng nó hoạt động. Lý do là mã này có một hằng số không xác định (bar) chứ không phải là một chuỗi ('bar' - thông báo các dấu ngoặc kép). PHP có thể trong tương lai xác định các hằng số, thật không may cho mã như vậy, có cùng tên. Nó hoạt động vì PHP tự động chuyển đổi một chuỗi trống (một chuỗi không được trích dẫn không tương ứng với bất kỳ biểu tượng đã biết nào) thành một chuỗi chứa chuỗi trống. Ví dụ, nếu không có hằng số được xác định có tên là bar, thì PHP sẽ thay thế trong chuỗi 'bar' và sử dụng nó.

Có một số ví dụ khác trong hướng dẫn sử dụng để bạn kiểm tra.

4

này là sai và sẽ tự động xác định một hằng số: tuy nhiên

$var = $array[bar]; 

sử dụng này là đúng:

$var = "string $array[bar] ..."; 

Đối với khả năng tương thích với PHP2 cú pháp cũ này vẫn được phép trong bối cảnh chuỗi. Việc trích dẫn khóa sẽ dẫn đến lỗi phân tích cú pháp, trừ khi bạn cũng sử dụng {dấu ngoặc nhọn} xung quanh nó.