Най-добри практики и стилове на кодиране, за да се научите да станете по-добър PHP програмист

Всички сме добри програмисти и знаем как да пишем добри програми, но има някои скрити неща, които може да сме пропуснали в света на програмирането. Познаването му може да ни помогне да подобрим скоростта и четливостта на нашия код. Бих искал да посоча няколко съвета и практики в PHP, които намерих за полезни.

Както знаете, PHP (Hypertext Preprocessor) е широко използван, безплатен, ефективен и многофункционален език за програмиране, който позволява на разработчиците да създават динамично съдържание, използвано основно за разработване на уеб базирани приложения. Нека се задълбочим малко в него, за да видим как можем да подобрим начина, по който го пишем. Тази статия има за цел да помогне на начинаещите PHP и нагоре. Ако все още не сте научили основите на PHP програмирането, отделете време да научите и се върнете.

1. Избягвайте късите PHP тагове

Кратките тагове (<? ?>, <?=?>) са лесни за използване, но не винаги са надеждни, тъй като кратките тагове могат да бъдат деактивирани чрез настройката short_open_tag ini и не всички сървъри са активирани по подразбиране. Така че кодът, написан в кратки тагове, не е преносим между сървъри, освен ако нямате достъп до ini настройките. Друга причина да избягвате кратък етикет е, че може да обърка с нотацията <?xml ?>. Препоръчителната употреба на PHP тага е <?php

<?php 
    // My super portable code goes here
?>

Освен това, ако сте сигурни, че вашата версия на PHP е 5.4.0 или по-нова, имате право да използвате и <?= ?> таг. Това е пряк синтаксис на echo и е доста удобно да отпечатате променлива във вградения код. От PHP 5.4.0 този таг е свободен от конфигурационната настройка short_open_tag ini.

<?=$myVariableToPrint?>

Сега се напрегнете, за да избегнете използването на този етикет

<?
    // My code that may not work on all servers
?>

Е, в историята има използвани и други етикети, които са изоставени в най-новите версии (PHP7+). Просто ги избройте, за да го добавите към списъка си с НЕОБХОДИМИ.

<% %> <%=%> // ASP style tag support in PHP
<script language="php"> </script>

2. Избягвайте затварящ етикет във файлове само за PHP

Ако вашият файл съдържа само PHP код, затварящият таг (?>) не е задължителен. Препоръчително е да избягвате затварящия таг, защото той предотвратява добавянето на нежелано празно пространство или нови редове в края на файловете. Това е удобно за използване на изходно буфериране и ще можем да добавим заглавки към отговора по-късно.



3. Форматиране и оформление на кода

Няма значение по отношение на изпълнението на кода, ако не сме форматирали добре кода. Но има значение, когато друг човек дойде да го прочете или друг екип се опита да го актуализира или дори най-лошото, когато се върнем, за да прегледаме собствения си код след дълго време.

Добре форматираният код е по-лесен за разбиране и изглежда последователен, чист и четим. Не отне много усилия, можете да използвате функцията за автоматично форматиране на кода на вашето IDE — повечето от добрите IDE имат тази опция или отделяте малко време, за да го форматирате сами. Прочетете повече за PSR-2: Ръководство за стил на кодиране, което е стандарт за стил на кодиране за форматиране на код.



Вижте пример за код с добър отстъп:

function calculate($a, $b, $c) {
    $result = 0;
    $x = $a + $b;
    if($x >= $c){
      $result = ($a + $b) * $c;
    }else{
      $result = $a * ($b + $c);
    }
    return $result;
}

И това НЕ е, не правете така

function calculate($a, $b, $c) { $result = 0;
    $x = $a + $b;
if($x >= $c){
          $result = ($a + $b) * $c;  }else{
 $result = $a * ($b + $c); }
    return $result;
}

4. Напишете кода на коментара

Коментарите са частта от кода, която помага да се опише какво прави дадена част от кода, функция или клас. Писането на коментари е добра практика, за да уведомите другите какво правите или да си припомните какво сте направили. Не искате да коментирате всеки ред във вашия код, но го правете, когато смятате, че е необходимо да разберете кода си по-късно.
Това са примерите за стилове на коментиране в PHP

<?php
echo 'Hello World 1'; // A single line comment
echo 'Hello World 2'; # Another way to do a single line comment

/*
   This is a multi-line comment
   Its cool when I want to write an essay about my code 
*/
echo 'Hello World 3';


5. Избор на имена

Наименуването на вашите променливи, функции или класове е важно. Докато наименувате, трябва да имате предвид тези фактори

  1. Името, което сте избрали, трябва да е смислено
  2. Името трябва да е на разбираем за всички език (за предпочитане на английски)
  3. Следвайте последователната конвенция за именуване

Има много стандарти за именуване с леки вариации, като PSR-1: Basic Coding Standard или Zend Framework Naming Conventions. Можете да изберете всеки стил въз основа на вашето удобство, просто се уверете, че е последователен през целия проект.
Най-често използвам следния стил на конвенция за именуване

  • Име на клас
  • име_на_функция
  • $име_на_променлива
  • CONSTANT_NAME

Ето списъка с най-доброто четене за конвенциите за именуване







6. Разбиране на „ехо“

Операторът PHP echo е езикова конструкция (не точно функция), използвана за извеждане на данни на екрана. echo и print и двете правят едно и също нещо, но echo е малко по-бързо. echo може да приема множество параметри и е по-бързо от конкатенирането на низове.

Например...

echo "Hello ", $name, "!";

е по-бързо и по-чисто от...

echo 'Hello ' . $name . '!';

Можете също така да използвате изрази

echo "Sum: ", 1 + 2;

което е по-добро от...

echo 'Sum: ' . (1 + 2);

Но echo няма върната стойност, така че не може да се използва в изрази. Така че следният код е невалиден!

($some_var) ? echo 'true' : echo 'false';

вместо това можете да използвате така

echo $some_var ? 'true' : 'false';


7. Използване на променливи

Не е необходимо да инициализирате променливи в PHP, но това е добра практика. Неинициализираните променливи ще имат стойност по подразбиране, разчитането на стойността по подразбиране може да доведе до неочаквани резултати от вашата програма. Затова се препоръчва да инициализирате вашите променливи, преди да ги използвате, и това ще направи кода ви много по-чист.

$my_array = array();
$my_integer = 0;
$my_boolean = false;

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

$my_name = $data['name']; 
echo $my_name;

В горния код определено можем да избегнем променливата $my_name, като...

echo $data['name'];

8. Използване на троични оператори

Един прост оператор if/else може да бъде променен, за да използва троични оператори. Това прави вашия код по-кратък, четим и спестява няколко реда. Използването е просто…

// Usage of Ternary Operators 
$variable = (CONDITION) ? IFTRUE : IFFALSE; 

// Similar if/else condition usage in one line
if(CONDITION) { $variable = IFTRUE; } else { $variable = IFFALSE; }

Примерно използване на троични оператори

$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

Идентичен е с този оператор if/else

if (empty($_POST['action'])) {
    $action = 'default';
} else {
    $action = $_POST['action'];
}


9. Използване на оператори за сравнение

PHP има строги и свободни оператори за сравнение, разликата е, че строгото сравнение валидира стойността и типа, докато слабото сравнение валидира само стойността. Можете да използвате всяко сравнение, но за да избегнете неочаквано поведение на програмата, трябва да сте много наясно какво правите.

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

Например, вие валидирате POST стойност и не знаете в кой тип ще идва винаги и ви интересува само стойността. След това преминете към свободно сравнение

// Pass if $_POST['user_id'] is an integer 1234 or a string '1234'
if($_POST['user_id'] == '1234'){  
    echo 'Hello Special user';
}

Но, например, вие валидирате върната стойност от функция и наистина ви интересува типът на върнатата стойност. В примера по-долу, ако не използвате стриктно сравнение, условието ще премине, ако функцията върне „1“, което ще бъде сериозен недостатък.

// Pass only if the function IsThisAdmin() return a boolean true
if(IsThisAdmin($_POST['user_id']) === true){
    echo 'Hello Admin';
}

Друг много често срещан пример за това е докато използвате strpos за сравняване на низове. Тук в примера по-долу, ако използвате != за сравнение, той отпечатва изход като „низът не е намерен“, което е грешно.

Причината е strpos връщане на 0, което е позицията на низа и свободното сравнение счита 0 за невярно, оттук и неочаквания резултат. Така че правилната проверка е следната...

if (strpos('abcdef', 'a') !== false) {
    echo 'string found'; // Found, thanks to operator !==
} else {
    echo 'string not found'; // Not found, thanks to operator !==
}




10. За струните

Нека да разгледаме често срещаните начини за определяне на низове и използването им в PHP.

Единични кавички

Оградено в единични кавички (') е лесен начин за указване на низ. Той не анализира никакви специални знаци, но позволява екраниращ знак с обратна наклонена черта (\), обикновено за избягване на единични кавички и самата обратна наклонена черта в низа. Така че този начин е идеален, ако искате да изведете специален символ буквално, като \r или \n, и този метод е добър, ако имате прост низ за указване.

echo 'Hello, \n this is a newline'; 
// Outputs: Hello, \n this is a newline

Двойни кавички

Заграждането в двойни кавички (") е друг начин за указване на низ и PHP ще интерпретира повече екраниращи последователности за специални знаци. Така че \n в низа наистина извежда нов ред, вместо буквално да го отпечата. И променливите, посочени в низа, ще бъдат анализирани и заменени с неговата стойност, ако има такава. Този метод е идеален, ако трябва да посочите променливи или специални знаци във вашия низ.

$name = "Dipu Raj";

echo "Hello, My name is $name"; 
// Outputs: Hello, My name is Dipu Raj

echo "See the first character of my name '{$name[0]}'";  
// Outputs: See the first character of my name 'D'

Много се говори за производителността и на двете спецификации на низове. Някои посочват, че единичният цитат е по-бърз, защото не включва много анализиране. Но по мое мнение и двете дават еднаква производителност при нормална употреба, няколко анализа не правят забележима липса на производителност. Така че използвайте всеки метод, който искате според ситуацията, освен ако не искате да направите микрооптимизация.

Heredoc и Nowdoc са другият сложен начин за указване на низове, те не се използват много често. Можете да прочетете повече за тях в ръководството за PHP низове.



11. Относно масивите

Масивът в PHP е оптимизиран за няколко различни приложения, може да се използва като масив, списък, хеш таблица, речник, колекция, стек, опашка и т.н. Нека разгледаме някои готини функции на PHP Array, които вероятно не се използват често.

От PHP 5.4 получаваме синтаксиса на краткия масив, който позволява да се използва [] вместо array(). Вижте краткия и нормален пример за синтаксис...

// Short array declaration syntax, as of PHP 5.4
$my_array = [1, 2, 3, 4]; 
$my_array_2 = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
 
// Regular array declaration syntax, all PHP versions
$my_array = array(1, 2, 3, 4); 
$my_array_2 = array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4);

Квадратни скоби и фигурни скоби могат да се използват за достъп до елементи на масив. И двата реда код имат същия ефект в примера по-долу...

echo $my_array[2];
echo $my_array{2};

От PHP 5.4 можем да имаме директен достъп до резултата от функция или метод като масив (дерефериране на масив).

<?php
function getColors() {
    return array('red', 'blue', 'green', 'yellow');
}

// As of PHP 5.4
$second_color = getColors()[1]; 

// Previously it was only possible using a temporary variable
$tmp = getColors();
$second_color = $tmp[1];

Цикълът foreach предоставя лесен начин за обхождане на масив

foreach ($my_array as $key => $value)
{
    echo 'Key: ', $key, ' Value: ', $value;
}

От PHP 5 можем да манипулираме стойността на масива директно, като ги предаваме по референция.

// PHP 5
foreach ($colors as &$color) {   // &$color pass by reference
    $color = strtoupper($color);
}

/* Make sure to unset the reference variable, 
   it may affect the array value if the variable $color is modified elsewhere in the code */
unset($color); // Unset the reference variable

// Older versions workaround
foreach ($colors as $key => $color) {
    $colors[$key] = strtoupper($color);
}

Използвайте кавички, ако имате ключ за масив като низ. Все още работи, ако не го направите, но това не се препоръчва. Причината е, че PHP го приема като константа, ако не го поставите в кавички, и PHP автоматично го преобразува в низ, ако няма дефинирана константа в това име, затова все още работи, но ние даваме на компилатора допълнително натоварване. Освен това, ако вече имате константа със същото име, получавате странни резултати.

echo $my_array_2['three']; // Correct
echo $my_array_2[three]; // Wrong code




Заключение

Надявам се, че съветите и практиките, обсъдени тук, са ви били полезни. Програмирането обаче е огромно, не спирайте да учите, опитвайте нови неща и бъдете в течение. Ако смятате, че има невярна информация или липсва пояснение, моля, уведомете с вашия коментар.

Честито кодиране!