Tại sao ví dụ về mảng PHP lại để lại dấu phẩy sau?


80

Tôi đã thấy các ví dụ như sau:

$data = array(
   'username' => $user->getUsername(),
   'userpass' => $user->getPassword(),
   'email' => $user->getEmail(),
);

Tuy nhiên, trong thực tế, tôi luôn luôn không bỏ dấu phẩy ở cuối. Tôi đang làm gì đó sai, hay đây chỉ là một cách làm 'khác'? Nếu tôi đang sử dụng một khung công tác không có dấu phẩy ở cuối sẽ ảnh hưởng tiêu cực đến việc tạo mã? Tôi cũng đã thấy việc sử dụng dấu phẩy ở cuối trong khai báo mảng ở các ngôn ngữ khác (Java, C ++), vì vậy tôi cho rằng lý do để lại dấu phẩy ở cuối không dành riêng cho PHP, nhưng điều này đã thu hút sự quan tâm của tôi.


1
Tôi có thể đã thề rằng tôi đã gặp lỗi phân tích cú pháp khi tôi bỏ dấu phẩy đào tạo trong PHP.
Lotus Notes

Tôi đoán là có thể. Trong ví dụ cụ thể này, nó phân tích cú pháp tốt.
ashurexm

Vâng @LotusNotes Tôi chắc chắn rằng tôi cũng đã từng mắc lỗi. Nhưng rõ ràng, không còn nữa!
Meezaan-ud-Din

Câu trả lời:


109

Tại sao ví dụ về mảng PHP lại để lại dấu phẩy sau?

Bởi vì họ có thể. :) Mục nhập Hướng dẫn sử dụng PHP cho các trạng thái mảng :

Có một dấu phẩy ở cuối sau mục nhập mảng được xác định cuối cùng, mặc dù không bình thường, là một cú pháp hợp lệ.

Nghiêm túc mà nói, điều này hoàn toàn nhằm mục đích thuận tiện, vì vậy bạn có thể dễ dàng thêm một phần tử khác vào mảng mà không cần phải thêm dấu phẩy vào trước vào mục cuối cùng.

Nói về các ngôn ngữ khác: Hãy cẩn thận với điều này trong JavaScript. Một số trình duyệt cũ hơn sẽ gặp lỗi, mặc dù những trình duyệt mới hơn thường cho phép điều đó.


1
Đây là những gì tôi đã hình dung, tôi chỉ không chắc liệu tôi có đang bỏ lỡ chiếc thuyền trên một cái gì đó. Tôi đoán đối với những người dành thời gian của họ trong một số ngôn ngữ cho phép điều này, đó có lẽ là một thói quen tốt. Nhưng do tôi xử lý nhiều ngôn ngữ khác nhau và như bạn đã nói JavaScript (và ai biết các ngôn ngữ khác) có thể gây ra lỗi, tôi có thể tiếp tục thói quen không để lại dấu phẩy ở cuối sẽ an toàn hơn.
ashurexm

7
Phiên bản JavaScript mới hơn so với mã IE6 / 7 để cho phép nó một cách rõ ràng ngay bây giờ.
staticsan

9
Perl cũng cho phép dấu phẩy ở cuối và tôi tin rằng điều đó được khuyến khích. Nó thực sự khá hay khi chia sẻ mã giữa các nhà phát triển bằng cách sử dụng kiểm soát nguồn. Nếu bạn muốn thêm một dòng vào cuối và bạn cần thêm dấu phẩy, điều đó có nghĩa là bạn đang chạm vào cả hai dòng. A git blame(hoặc tương đương trong điều khiển nguồn khác) sẽ cho thấy rằng bạn đã viết dòng đó mặc dù bạn chỉ thêm dấu phẩy vào đó. Không phải là một vấn đề lớn nhưng tiện dụng.
redbmk

2
Sẽ rất hữu ích nếu bạn có các tệp dưới quyền kiểm soát nguồn để giữ cho số dòng thay đổi ở mức thấp.
hakre

6
JSON cũng vậy, JSON ghét dấu phẩy ở cuối.
Kyle Hotchkiss

27

Đây là một thực hành tốt khi xác định mảng trên nhiều dòng. Nó cũng được khuyến khích bởi các tiêu chuẩn mã hóa của ZendFramework :

Khi sử dụng khai báo sau này, chúng tôi khuyến khích sử dụng dấu phẩy ở cuối cho mục cuối cùng trong mảng; điều này giảm thiểu tác động của việc thêm các mục mới trên các dòng kế tiếp và giúp đảm bảo không xảy ra lỗi phân tích cú pháp do thiếu dấu phẩy.


23

Tôi nhận thấy khi làm việc với điều khiển phiên bản (git) rằng nếu chúng ta thêm 1 thứ vào một mảng và chúng ta không có dấu phẩy ở cuối, nó sẽ giống như chúng ta đã sửa đổi 2 dòng vì dấu phẩy phải được thêm vào dòng trước đó. Tôi thấy điều này trông xấu và có thể gây hiểu nhầm khi xem các thay đổi của tệp, và vì lý do này, tôi nghĩ dấu phẩy ở cuối là một điều tốt.


Và đó là, chắc chắn, tại sao dấu phẩy ở cuối dành cho :) Tính nhất quán khác biệt
Ninj

Tôi không biết nó có liên quan gì đến lý do tại sao nó ở đó không. Tôi sẽ nghĩ là không. Nhưng tôi thấy nó hữu ích.
user985366 12/09/17

Nhưng đó lý do tại sao nó ở đây. Người ta có thể nói rằng nó ở đây để ngăn chặn những sai lầm trên thêm dòng tiếp theo. Nhưng không phải vậy, bởi vì bây giờ không có IDE nào cho phép bạn thêm các dòng mà không cần bắt đầu, nó sẽ bật ra một thông báo lỗi.
Ninj

@Ninj Thật thú vị. Tôi nhận xét đầu tiên của bạn là mỉa mai, nhưng tôi không chắc.
user985366 22/09/17

1
Xin lỗi, nó có thể đã trông như mỉa mai. Nó rất nghiêm trọng. Chúng tôi thêm dấu phẩy trên dòng mảng cuối cùng để giúp các khác biệt về lập phiên bản được rõ ràng.
Ninj

8

Bởi vì nó giữ cho các mục đồng nhất.

Nếu bạn phải hoán đổi thứ tự hoặc thêm hoặc xóa các mục nhập, bạn biết rằng có thể để lại dấu phẩy ở cuối là rất thuận tiện.

Nếu phần tử cuối cùng không thể có dấu phẩy, thì bạn sẽ phải duy trì dấu phẩy cuối cùng bằng cách sửa đổi các mục nhập. Đó là một bài tập vô nghĩa và lãng phí thời gian và các động tác vuốt ngón tay vì mục đích hoán đổi hoặc sửa đổi các mục đã được hoàn thành.

Bằng cách cho phép một dấu phẩy ở cuối phần tử cuối cùng, nó giải phóng người lập trình khỏi việc phải chú ý đến chi tiết khó chịu và không có kết quả này.


6

Lý do là thay đổi cam kết.

Nếu bạn phải thêm dấu phẩy ở cuối khi thêm một phần tử mới. Bạn đang thay đổi 1 dòng và thêm 1 dòng. (- ++)

Khi thêm phần tử mới khi đã có dấu phẩy ở dòng trên. Chỉ có 1 dòng được thêm vào và không có dòng nào thay đổi. (+)


5

Tôi không thể nói thay cho người khác, nhưng tôi thường để lại dấu phẩy ở cuối mã của mình. Tôi làm như vậy vì nếu / khi tôi sau này thêm vào mảng, tôi không phải lo lắng về việc bỏ lỡ dấu phẩy do quên thêm dấu phẩy vào dòng cuối cùng trước đó.


4

Tôi cảm thấy rằng mặc dù nó được cho phép, nó là một hành vi xấu, nó giống như bỏ dấu chấm phẩy cuối cùng của các hàm và vòng lặp của bạn.


3

Tôi luôn làm dấu phẩy ở cuối vì nó giúp tránh lỗi cú pháp trong khi thêm các phần tử mảng mới ... đó chỉ là một phương pháp hay.


3
Tôi xin lỗi vì đã khôi phục điều này nhưng, làm cách nào để dấu phẩy ở cuối ngăn lỗi cú pháp sau này? Tôi vừa phát hiện ra rằng PHP cho phép sử dụng dấu phẩy ở cuối - nhưng tôi không thể thấy / tìm thấy cách sử dụng cho nó. Việc thêm các chỉ mục mới sau này vẫn được thực hiện $arr[] = ....
Daniel

@Daniel, anh ấy đang nói về việc quay lại mã nguồn sau đó và thêm một dòng khác vào mảng.
Sam Dufel

1

Nếu bạn xem một ví dụ về cấu hình tệp khối tròn (config.inc.php), chúng có ví dụ có và không có dấu phẩy ở cuối.

Mảng này xác định những plugin nào nên được bật hoặc tắt:

...
// List of active plugins (in plugins/ directory)
$config['plugins'] = array(
'managesieve',
'password',
'archive',
'zipdownload',
);
...

Thông thường, điều này sẽ là từng dòng và nếu ai đó muốn thêm thứ gì đó vào mảng, họ có thể thực hiện điều này:

...
// List of active plugins (in plugins/ directory)
$config['plugins'] = array(
'managesieve', //code by personA
'password', //code by personA
'archive', //code by personA
'zipdownload', //code by personA
'newplugin', //new code by personB
);
...

Vì vậy, khi họ cam kết mã này, họ chỉ thấy một thay đổi cho dòng cụ thể đó và điều này dễ đọc hơn khi kiểm tra xem ai đang thực hiện thay đổi mã cho dòng cụ thể đó.

Trong một dòng mã khác, bạn có thể thấy điều này mà không có dấu phẩy ở cuối:

...
$config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'INBOX.spam', 'Trash');
...

Thông thường nó sẽ là một dòng mã mà không ai mong đợi mã này được thay đổi thường xuyên.

Trong một từ khác:

1) Đặt dấu phẩy ở cuối nếu mảng được sử dụng như một tùy chọn hoặc tệp cấu hình có thể cần được thay đổi động trong tương lai. Bên cạnh đó, nếu bạn thực hiện các thay đổi đối với mảng đó theo lập trình bằng cách sử dụng dấu phẩy ở cuối, bạn chỉ thực hiện thay đổi đối với một mã dòng, trong khi nếu không có nó, bạn phải xử lý 2 dòng mã và điều này có thể gây ra sự phức tạp hơn khi phân tích mảng

2) Bạn không phải đặt dấu phẩy ở cuối nếu mảng là một mảng không đổi và bạn không mong đợi nó sẽ thay đổi trong tương lai nhưng như đã đề cập trong Câu trả lời được chấp nhận, bạn có thể đặt dấu phẩy nhưng nó không có mục đích


0

Điều này làm tôi ngạc nhiên gần đây, nhưng nó có ý nghĩa. Từ lâu, tôi đã cố gắng tuân thủ một quy ước trước đó để đạt được điều tương tự, đó là đặt dấu phẩy ngăn cách trước mỗi mục nhập thay vì ở cuối.

$data = array(
   'username' => $user->getUsername()
 , 'userpass' => $user->getPassword()
 , 'email' => $user->getEmail()
);

Tất cả các dấu phẩy cũng xếp hàng theo cách đó, trông đẹp mắt, nhưng nó có thể khiến việc thụt lề hơi khó xử. Có lẽ vì lý do đó, nó dường như không được phát triển nhiều trong những năm qua, và tôi đã có những người khác hỏi tôi tại sao tôi làm điều đó. Tôi đoán giải pháp của PHP là một sự thỏa hiệp tốt, và trong mọi trường hợp, nó rõ ràng là giải pháp được chấp nhận hiện nay.


0

Tôi luôn thêm dấu phẩy vào đầu mục mới. Các trình biên dịch coi nó như một mã thông báo nhìn trước một ký tự cho biết "sắp có một cái khác". Tôi không biết liệu các trình biên dịch hiện đại có sử dụng LR (1) (đệ quy trái, một mã thông báo nhìn trước hay không) nhưng tôi nghĩ đó là nơi bắt nguồn lỗi cú pháp khi dấu phẩy không có gì sau nó. Hiếm khi tôi từng có nhà phát triển khác đồng ý với tôi, nhưng có vẻ như JohnBrooking thì có!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.