Лучшие практики и стили кодирования, которые помогут вам стать лучшим программистом на PHP

Мы все хорошие программисты и знаем, как писать хорошие программы, но есть некоторые скрытые вещи, которые мы могли упустить из мира программирования. Знание этого может помочь нам улучшить скорость и читабельность нашего кода. Я хотел бы указать на несколько советов и практик в PHP, которые я нашел полезными.

Как вы знаете, PHP (препроцессор гипертекста) — это широко используемый, бесплатный, эффективный и универсальный язык программирования, который позволяет разработчикам создавать динамический контент, в основном используемый для разработки веб-приложений. Давайте немного углубимся в это, чтобы увидеть, как мы можем улучшить то, как мы это пишем. Эта статья предназначена для начинающих пользователей 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';


PHP: комментарии — вручную
Стили комментариев «однострочные
комментируют только конец строки или текущий блок кода PHP, в зависимости от того, что наступит…php.net»



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.

Одиночные кавычки

Заключенный в одинарные кавычки (') простой способ указать строку. Он не анализирует какие-либо специальные символы, но разрешает escape-символ с обратной косой чертой (\), как правило, для экранирования одинарных кавычек и самой обратной косой черты в строке. Таким образом, этот способ идеально подходит, если вы хотите вывести специальный символ буквально, например \r или \n, и этот метод хорош, если вам нужно указать простую строку.

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

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

Заключенный в двойные кавычки (") — это еще один способ указать строку, и PHP будет интерпретировать больше escape-последовательностей для специальных символов. Таким образом, \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, которые, вероятно, не используются обычно.

Начиная с 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




Вывод

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

Удачного кодирования!