Чому приклади масивів PHP залишають кінцеву кому?


80

Я бачив такі приклади:

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

Однак на практиці я завжди не залишав кінцевої коми. Я роблю щось не так, чи це просто "інший" спосіб це зробити? Якби я використовував фреймворк, чи не матиме кінцева кома негативно впливати на генерацію коду? Я також бачив використання кінцевих коми в оголошеннях масивів іншими мовами (Java, C ++), тому я припускаю, що причини залишення кінцевих коми не є специфічними для PHP, але це викликало у мене інтерес.


1
Я міг поклястись, що отримував помилки синтаксичного аналізу, коли залишав навчальні коми у PHP.
Lotus Notes

Це можливо, я здогадуюсь. У цьому конкретному прикладі він аналізується дуже добре.
ashurexm

Так @LotusNotes Я впевнений, що і раніше мав помилки. Але зрозуміло, вже не!
Meezaan-ud-Din

Відповіді:


109

Чому приклади масивів PHP залишають кінцеву кому?

Тому що вони можуть. :) Введення вручну PHP для станів масиву :

Наявність кінцевої коми після останнього визначеного запису масиву, хоча і є незвичним, є допустимим синтаксисом.

Серйозно, це цілком для зручності, тому ви можете легко додати до масиву ще один елемент без необхідності попередньо додавати кінцеву кому до останнього запису.

Говорячи про інші мови: будьте обережні з цим у JavaScript. Деякі старіші браузери видають помилку, хоча новіші зазвичай дозволяють.


1
Це те, що я зрозумів, я просто не був впевнений, чи не пропустив я чогось на човні. Думаю, для людей, які проводять час кількома мовами, що дозволяють це, це, мабуть, гідна звичка. Але враховуючи те, що я маю справу з багатьма різними мовами, і, як ви сказали, JavaScript (і хто знає, які ще мови) може спричиняти помилки, для мене може бути безпечнішим продовжувати свою звичку не залишати кінцевої коми.
ashurexm

7
Зараз новіші версії JavaScript, ніж код IE6 / 7, явно дозволяють це.
staticsan

9
Perl також дозволяє кінцеву кому, і я вважаю, що це заохочується. Насправді це дуже приємно мати під час обміну кодом між розробниками за допомогою вихідного контролю. Якщо ви хочете додати рядок до кінця і вам потрібно додати кому, це означає, що ви торкаєтесь обох рядків. Знак git blame(або еквівалент в іншому елементі керування джерелом) покаже, що ви написали цей рядок, хоча ви щойно додали до нього кому. У будь-якому випадку не величезна угода, але зручна.
redbmk

2
Це корисно, якщо у вас є файли під контролем джерела, щоб зменшити кількість змінених рядків.
hakre

6
JSON теж, JSON ненавидить кінцеві коми.
Kyle Hotchkiss

27

Це хороша практика при визначенні масиву на декількох рядках. Це також заохочується стандартами кодування ZendFramework :

Використовуючи останню декларацію, радимо використовувати кінцеву кому для останнього елемента масиву; це мінімізує вплив додавання нових елементів на послідовні рядки та допомагає забезпечити відсутність помилок синтаксичного аналізу через відсутність коми.


23

Я помітив під час роботи з контролем версій (git), що якщо ми додамо 1 річ до масиву, а у нас немає кінці, що здається, це буде виглядати так, ніби ми змінили 2 рядки, тому що кома мала бути додана до попереднього рядка. Я вважаю, що це виглядає погано і може ввести в оману при перегляді змін файлу, і з цієї причини я вважаю, що завершальна кома - це добре.


І це, безумовно, чому кінцеві коми є для :)
Різна

Не знаю, чи пов’язано це з тим, чому це там. Думаю, ні. Але я вважаю це корисним.
user985366

Але це причина, чому вона тут. Можна сказати, що це тут, щоб запобігти помилкам у наступному рядку. Але це не так, оскільки сьогодні жодна IDE не дозволяє додавати рядки без комі, це спричинить повідомлення про помилку.
Ніндж

@Ninj Цікаво. Я сприйняв ваш перший коментар як іронічний, але я не був упевнений.
user985366

1
Вибачте, це могло виглядати іронічно. Це було дуже серйозно. Ми додаємо коми в останньому рядку масиву, щоб покращити різницю в варіаціях.
Ніндж

8

Тому що він підтримує уніфікованість записів.

Якщо вам довелося поміняти місцями замовлення або додати чи видалити записи, ви знаєте, що можливість залишити кінцеву кому дуже зручна.

Якщо останній елемент не може мати коми, тоді вам в кінцевому підсумку доведеться підтримувати останню кому, змінюючи записи. Це безглузда вправа і втрата часу та мазків пальців, оскільки намір поміняти місцями або змінити записи вже здійснено.

Дозволяючи кінцеву кому на останньому елементі, це звільняє програміста від необхідності схилятися до цієї прикрої і безрезультатної деталі.


6

Причиною є зміни комітів.

Якщо вам потрібно додати завершальну кому при додаванні нового елемента. Ви міняєте 1 рядок і додаєте 1 рядок. (- ++)

При додаванні нового елемента, коли кома вже є у рядку вище. Додано лише 1 доданий рядок, а жодного не змінено. (+)


5

Я не можу говорити за інших людей, але зазвичай я залишаю в коді кінцеву кому. Я роблю це, тому що, якщо / коли я пізніше додаю до масиву, мені не доведеться турбуватися про те, щоб пропустити кому через те, що забув додати кому до того, що раніше було останнім рядком.


4

Я вважаю, що навіть незважаючи на те, що це дозволено, це погана практика, це все одно, що залишити останню крапку з комою ваших функцій та циклів.


3

Я завжди роблю кінцеву кому, оскільки це допомагає уникнути синтаксичних помилок при додаванні нових елементів масиву ... це просто хороша практика.


3
Мені шкода за пожвавлення цього, але як згодом кінцева кома запобігає синтаксичним помилкам? Я щойно дізнався, що PHP дозволяє використовувати кінцеву кому, але я не бачу / не знаходжу для неї використання. Пізніше додавання нових індексів все ще виконується $arr[] = ....
Даніель

@Daniel, він говорить про повернення до вихідного коду пізніше та додавання ще одного рядка до літералу масиву.
Sam Dufel

1

Якщо ви подивитесь на приклад конфігурації файлу roundcube (config.inc.php), у них є приклад із кінцевою комою та без неї.

Цей масив визначає, які плагіни слід увімкнути чи вимкнути:

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

Зазвичай це буде рядок за рядком, і якщо хтось хоче додати щось у масив, він може зробити це:

...
// 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
);
...

Отже, коли вони фіксують цей код, вони бачать лише одні зміни для цього конкретного рядка, і це стає більш читабельним при перевірці, хто вносить зміни в код для цього конкретного рядка.

В іншому рядку коду ви можете побачити це без кінцевої коми:

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

Зазвичай це один рядок коду, де ніхто не очікує частого зміни цього коду.

Іншим словом:

1) Поставте завершальну кому, якщо масив використовується як параметр або файл конфігурації, який, можливо, доведеться динамічно змінювати в майбутньому. Крім того, якщо ви вносите зміни в цей масив програмно, використовуючи кінцеву кому, ви вносите зміни лише до одного рядкового коду, тоді як без нього вам доведеться мати справу з 2-ма рядковими кодами, і це може призвести до складності синтаксичного аналізу масиву.

2) Вам не потрібно ставити завершальну кому, якщо масив є постійним масивом, і ви не очікуєте, що він зміниться в майбутньому, але, як згадується у прийнятій відповіді, ви можете поставити завершальну кому, але це не має мети


0

Це мене нещодавно здивувало, але це має сенс. Я давно намагався дотримуватися попередньої конвенції, яка робить те саме, тобто ставити розділювальну кому перед кожним записом, а не в кінці.

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

Коми також всі вибудовуються таким чином, що виглядає приємно, але це може зробити відступ трохи незручним. Можливо, з цієї причини, здається, це не зачепило багато років, і у мене були інші, хто запитував мене, чому я це роблю. Я думаю, що рішення PHP є хорошим компромісом, і в будь-якому випадку це, мабуть, прийняте рішення зараз.


0

Я завжди додавав коми на початку нового запису. Компілятори розглядають це як односимвольний знак перспективи, який говорить, що "є ще один". Я не знаю, чи використовують сучасні компілятори LR (1) (ліворекурсивний одиночний маркер вперед), але я думаю, що саме тут виникає синтаксична помилка, коли кома після неї нічого не має. Рідко коли-небудь доводилося, щоб інший розробник погоджувався зі мною, але схоже, що це робить JohnBrooking!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.