20 речей, які відрізняють PHP-програміста від мавпочки


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

PHP – найпопулярніша мова для написання коду серверної частини. Тієї самої мети на ньому можна досягти декількома шляхами: можна спроектувати красиву і легко підтримувану систему, а можна швидко зліпити разом ланки коду зі Stack Overflow, не забиваючи собі занадто голову такими речами, як правила проектування і читання коду.

Звичайно, навіть якщо Ви ще не гуру розробки, все одно захочете писати код, через який оточуючим не захочеться плакати. У цій статті зібрані 20 порад, кожна з яких допоможе Вам поліпшити читабельність коду і за дотримання яких Вам потім скажуть “дякую”. Старанне слідування цим порадам допоможе Вам стати ближче до статусу досвідченого розробника, уважного до деталей.

Відділяйте файли з параметрами

Немає жодної вагомої причини, яка б виправдала зберігання налаштувань в одному файлі зі скриптом. Завжди створюйте окремий файл і на самому початку скрипта його підключайте. Ви зрозумієте, як це важливо, коли Вам доведеться редагувати купу файлів через зміну одного параметра. Це ж зовсім нескладно:

include ("config.php");

Коментарі – ваші друзі

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

// Однорядковий коментар/** Багаторядковий коментар **/

Правда, просто? Ще варто звернути увагу на PHPDoc.

Грамотно форматуйте код

Немає нічого гіршого за величезну стіну коду, автор якого явно не знав про наяність кнопки Tab. Не врятують навіть коментарі – відступи придумали для того, щоб логічно відділяти один від одного фрагменти коду. А використання або невикористання відступів багато говорить про Вас як про програміста. Ось цей код відформатований неправильно:

function dothisformula ($a,$b) { $c = $b+$a; $e=3;while ($c < 20) {$e = $e - 1; $c = $c + 1; }return $e; }

А ось той самий код, але з правильним форматуванням:

function dothisformula ($a, $b) {
$c = $b + $a; $e = 3; while ($c < 20) { $e = $e - 1; $c = $c + 1; } return $e;}

Якщо Ви хочете точно знати, який спосіб форматування коду правильний – зважайте на PSR .

Давайте змінним зрозумілі імена

Звичайно, до єдиної думки з цього питання дійти не можна: camelCase або under_score? Чи потрібна Угорська нотація? Важливо тут одне: раз і назавжди визначіться, що Вам ближче. А навіть якщо Вам і захочеться змінити стиль, то будь ласка, не робіть це посеред проекту! Різні варіанти іменування змінних в одному проекті або, що ще гірше, в одному файлі – це жахливо. І жодних магічних чисел! Не полінуйтеся використати константи.

Ініціалізуйте змінні

Звичайно, PHP автоматично створює змінні при спробі до них звернутися. Вам не здається, що користуватися цією особливістю ризиковано? Доцільною практикою вважається завжди ініціалізувати змінні ще перед першим використанням. Це зробить код зрозуміліше і допоможе переконатися, що Ви не звертаєтеся випадково до неініціалізованої змінної.

$foo = array ();$bar = 0;$baz = false;

Булева змінна неправдива, інакше – істинна

Якщо Ви перевіряєте якусь умову і потім результат порівняння зберігаєте у булевому значенні, при ініціалізації змінної для результату (ми завжди заздалегідь ініціалізували змінну, пам’ятаєте?) спочатку привласнюйте їй false. Ось так робити не потрібно:

function getStatus (){ $result = true;
if ($i != 2)  $result = false; return $result;}

Краще ось так:

function getStatus (){ $result = false; if ($i == 2)  $result = true; return $result;}

Навіщо це потрібно? Уявіть, що Ви перевіряєте дані перед запитом до бази. Якщо з якоїсь причини блок if раптом не виконається, то значення змінної залишиться false – так Ви підстрахуєте себе від потрапляння  у базу помилкових даних. У коді іноді доводиться мати справу з конфіденційними даними, так що краще спочатку виходити з того, що всі дані помилкові, поки не доведене зворотнє. Це правило практично написане кров’ю.

До речі, краще перевіряти, чи є дані такими, як потрібно нам, ніж чи є вони такими, як нам не потрібно.

Використайте лапки, коли звертаєтеся до елементів масиву

У коді різних розробників можна побачити два варіанти доступу до елементів асоціативного масиву:

$name = $names['marc'];$name = $names[marc];

Під час виконання другого варіанта PHP спочатку спробує знайти константу з ім’ям marc. І тільки якщо такий не знайдеться, marc буде сконвертировано в рядок і передано у такому вигляді. Краще не думати про те, що може статися, якщо раптом така константа існуватиме. Завжди ставте лапки, щоб такого не відбувалося.

Використайте коми, щоб звернутися до декількох рядків в одному виклику

Якщо Вам потрібно, наприклад, в одному виклику функції звернутися до значення змінної і до рядка, краще використайте коми, а не точки. Чому? Точка – оператор конкатенації рядків, ця операція виконуватиметься повільніше. Доказ.

Ще раз. Так потрібно:

echo "Hello, my name is ", $name;

А ось так – не потрібно:

echo "Hello, my name is ". $name;

Користуйтеся тернарними операторами

Якщо у Вас в коді якесь дуже просте порівняння, бажано використати тернарний оператор, щоб не розтягувати простий код на декілька рядків. Ось так може виглядати Ваш простий if:

if ($a == 1)  $b = 2;else
$b = 3;

але можна записати його і так:

$b =  ($a == 1) ? 2: 3;

Узагальнено тернарный оператор працює так:

$variable =  ($condition) ? true: false;

Використайте для порівняння з булевими значеннями строге порівняння

Якщо Ви перевіряєте змінну на true чи false, використайте ===, а не ==, яке задіюється в інших порівняннях. Строге порівняння з трьох знаків рівності порівняє ще і типи змінних.

if ($isMember == true) { ... } // Неправильно if ($isMember === true) { ... } // Правильно

Використайте інкремент і декремент

Якщо Вам треба просто збільшити або зменшити на 1 значення змінну, ні до чого писати цю громіздку конструкцію:

$number = $number + 1;$number2 = $number2 - 1;

Куди лаконичнее такий варіант:

$number++; // Інкремент $number2--; // Декремент

А головна привабливість цих операцій полягає в тому, що одночасно з ними можна виконувати ще яку-небудь дію (наприклад, if чи while). Залежно від того, чи написано -- чи ++ до або після самої назви змінною, черговість операцій змінюється.

// Інкремент станеться після порівняння:$number = 10;while ($number++ == 10) { ... }// А тут декремент станеться перед порівнянням:$number = 10;
if (--$number == 10) { ... }$number = 10;$total = $number++;// $total дорівнюватиме 10.$number = 10;$total = --$number;// $total дорівнюватиме 9.

Використайте скорочені оператори привласнення

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

$a = $a + $b;$a = $a * 5;$a = $a - $d;$a = $a / 3;

А використовуючи скорочені оператори, цей же код можна буде записати так:

$a += $b;$a *= 5;$a -= $d;$a /= 3;

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

$string = $string . "hello";
$string .= " hello";

Створіть окрему функцію для var_dump

Іноді буває треба під час активної відладки часто виводити прямо на сторінку значення якоїсь змінної. Звичайно, краще зайвий раз так не робити, але якщо все-таки треба, то має сенс собі допомогти. Тег pre використовується, щоб зробити значення більше читаним. До речі, таке дивне ім’я функції дане невипадково – воно коротке, хоч і неочевидне. Набрати її назву буде швидко. Тільки потім не забудьте прибрати цю функцію, коли підчищатимете код наприкінці розробки.

Але краще за все забути цю пораду і навчитися користуватися XDebug.

Користуйтеся константами

Якщо у Вас є змінна, значення якої змінювати не варто, має сенс використати замість неї константу. Константи можна використати, щоб зберігати в них шляхи, повідомлення про помилки і так далі. Ім’я константам варто давати капсом – так їх буде просто відрізнити, і Ви будете впевнені, що викликаєте те, що треба.

define ("DIRECTORY", "/path/to/site/");echo DIRECTORY;

Користуйтеся $_ GET і $_ POST

$_ REQUEST краще не використовувати. Чітко розділяйте дані: $_ GET – це параметри, передані з адресного рядка, $_ POST – це, наприклад, отримані з форми дані. І не додумайтеся передавати в скрипт паролі, особливо незашифровані, GET-запитом!

$action = $_ GET['actions'];$name = $_ POST['name'];

Користувачі можуть руками замінити значення в адресному рядку на будь-які довільні й доставити Вам немало клопоту.

Використайте об’єкти, а не функції

PHP – все-таки у тому числі й об’єктно орієнтована мова. Якщо Ви працюєте над великим проектом, сотні рядків функціонального коду Вам точно швидко набриднуть. А якщо Вам треба зберігати багато однотипних параметрів, то тим більше замисліться про використання відповідного класу.

Викликайте методи ланцюжками

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

class User { function setThis ($var) { .... return $this; } function setThis2 ($var2) { .... return $this; }}

то звертатися до його методів можна так:

$user = new User ();$user ->setThis (...) ->setThis2 (...);

Щоб краще зрозуміти, як це працює і за яких обставин можна це користуватися, читайте статтю.

Не повторюйте себе

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

Почитайте про методи DRY і WET.

Прагніть до слабкої зв’язаності й сильної зчепленості

Зв’язаність – це спосіб проектування проекту, коли зміна одного компонента вимагає зміни іншого. Іншими словами, якщо Ви зміните одну функцію, чи доведеться міняти іншу? Чим вільніше зв’язок, тим простіше буде міняти компоненти, не перекопуючи половину коду.

Зчепленість – це коли разом окремі частини утворюють значущу одиницю. У Вас є одна функція або метод на весь проект, яка робить взагалі все можливе і неможливе, або є багато функцій або методів, кожен з яких виконує свою ділянку роботи? Особливо це стосується ТОП. Діліть методи, магічні методи на десятки і сотні рядків неприпустимі.

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

Проілюструвати цю пораду можна так. Візьмемо цей код:

/* Ми хочемо скласти два числа, тільки якщо перше число менше 5 */function add ($var, $var2) { if ($var < 5) return false; else $result = $var + $var2; echo "The Result is ", $result;}$var = 3;$var2 = 2;add ($var, $var2);

Головний мінус цієї функції в тому, що вона сама здійснює перевірку даних, а потім виводить на екран значення. Така поведінка не зовсім очевидна – погодитеся, так вибірково працююче складання Вам навряд чи ще десь повторно знадобиться. А якщо Вам ще і захочеться поміняти повідомлення для виведення? Цей код краще переписати так:

function add ($var, $var2) { return $var + $var2;}function result ($message) { return "The Result is ". $message;}$var = 3;$var2 = 2;if ($var < 5) { echo result (add ($var, $var2));}

Тепер кожна функція виконує тільки свою роботу: add складає числа, result виводить результат.

Джерело: Блог GauraKGupta

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *