An open API service indexing awesome lists of open source software.

https://github.com/cosmopolityan/effective-php-development-with-tips-and-tricks

Перевод Effective PHP development with tips and tricks (by Michael Lappenbusch)
https://github.com/cosmopolityan/effective-php-development-with-tips-and-tricks

book php study-materials

Last synced: 12 months ago
JSON representation

Перевод Effective PHP development with tips and tricks (by Michael Lappenbusch)

Awesome Lists containing this project

README

          

# Эффективная разработка на PHP с советами и подсказками

Переведено с английского языка, с согласия автора (Michael Lappenbusch).
# Оглавление

1. [Введение в PHP](#1-введение-в-php)
- [Что такое PHP?](#что-такое-php)
- [Настройка среды разработки](#настройка-среды-разработки)
- [Основной синтаксис PHP](#основной-синтаксис-php)
2. [Переменные и типы данных](#2-переменные-и-типы-данных)
- [Скалярные типы данных](#скалярные-типы-данных)
- [Массивы](#массивы)
- [Объекты](#объекты)
3. [Управляющие структуры (конструкции)](#3-управляющие-структуры-конструкции)
- [Ветвления (if/else)](#ветвления-ifelse)
- [Циклы (for/while)](#циклы-forwhile)
4. [Функции](#4-функции)
- [Создание функций)](#создание-функций)
- [Передача аргументов](#передача-аргументов)
- [Возвращаемые значения](#возвращаемые-значения)
5. [Работа с базами данных](#5-работа-с-базами-данных)
- [Установление соединения](#установление-соединения)
- [Запросы](#запросы)
- [CRUD-операции (Create, Read, Update, Delete)](#crud-операции-create-read-update-delete)
6. [Безопасность](#6-безопасность)
- [Избегание SQL-инъекций](#избегание-sql-инъекций)
- [Шифрование](#шифрование)
7. [Обработка ошибок](#7-обработка-ошибок)
- [Обработка исключений](#обработка-исключений)
- [Сообщения об ошибках](#сообщения-об-ошибках)
8. [Продвинутые концепции](#8-продвинутые-концепции)
- [Классы и объектно-ориентированное программирование](#классы-и-объектно-ориентированное-программирование)
- [Пространства имен](#пространства-имен)
- [События и обратные вызовы](#события-и-обратные-вызовы)
9. [Расширения и внешние библиотеки](#9-расширения-и-внешние-библиотеки)
- [Использование Composer](#использование-composer)
- [Интеграция внешних библиотек](#интеграция-внешних-библиотек)
10. [Информация](#информация)
11. [Ссылки](#ссылки)

## 1. Введение в PHP

### Что такое PHP?

**PHP (Hypertext Preprocessor)** — это язык сценариев (скриптовый язык) на стороне сервера, используемый в основном для разработки веб-приложений. Он позволяет создавать динамические веб-страницы, комбинируя HTML, CSS и JavaScript с информацией из баз данных и других источников.

PHP был разработан Расмусом Лердорфом в 1995 году и с тех пор стал одним из самых распространенных скриптовых языков для веб-разработки. Он может работать практически на всех операционных системах и серверах, а также существует множество инструментов и фреймворков, облегчающих разработку приложений на PHP.

Одно из главных преимуществ PHP — возможность встраивания в HTML, что позволяет разработчикам интегрировать динамическую функциональность непосредственно в HTML-структуру страницы. PHP также позволяет взаимодействовать с базами данных, что делает его идеальным для создания систем управления контентом, онлайн-форм и других типов приложений, хранящих и получающих данные.

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

В целом, PHP — это мощный и гибкий скриптовый язык, который идеально подходит для разработки веб-приложений и стал популярным среди разработчиков благодаря своей простоте и доступности.

### Настройка среды разработки

Одним из первых шагов в разработке PHP-приложений является создание подходящей среды разработки. Этот процесс может варьироваться в зависимости от выбранной операционной системы и средств разработки, но в целом он включает в себя установку необходимого программного обеспечения и настройку среды.

Важной частью среды разработки PHP является веб-сервер, на котором могут выполняться PHP-скрипты. Одними из наиболее часто используемых веб-серверов для разработки PHP являются Apache и Nginx. Оба они могут быть установлены на Windows, macOS и Linux.

Другим важным элементом является база данных, которая обычно используется для хранения данных. MySQL, PostgreSQL и SQLite — одни из наиболее часто используемых баз данных в PHP-приложениях.

Для выполнения PHP-кода также необходим интерпретатор PHP. Большинство операционных систем поставляются с предустановленным интерпретатором PHP, но для получения последних функций и обновлений безопасности может потребоваться установка более новой версии.

Текстовый редактор или интегрированная среда разработки (IDE) — еще один важный инструмент, необходимый для создания и редактирования PHP-кода. Одними из самых популярных текстовых редакторов являются Sublime Text, Atom и Visual Studio Code, а самыми популярными IDE для разработки PHP являются PhpStorm, Eclipse и NetBeans.

Существует также множество инструментов, упрощающих настройку среды разработки PHP, например XAMPP (Windows, Linux, macOS), WAMP (Windows) и LAMP (Linux). Эти пакеты обычно включают в себя веб-сервер, базу данных и интерпретатор PHP и позволяют разработчикам быстро и легко создать рабочую среду.

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

Еще одним важным моментом при создании среды разработки является выбор правильного фреймворка или библиотек. Существует множество фреймворков и библиотек для разработки на PHP, таких как Laravel, CodeIgniter и Symfony, которые могут упростить разработку приложений и повысить удобство повторного использования кода.

Наконец, важно отметить, что настройка среды разработки — это важный шаг в разработке PHP, и важно тщательно спланировать его и выбрать правильные инструменты и библиотеки, чтобы разработка приложений была максимально эффективной и безопасной.

### Основной синтаксис PHP

Основной синтаксис PHP прост и похож на синтаксис языка C или Java. PHP-код встраивается в HTML-страницу и начинается и заканчивается тегами PHP, которые указывают, где начинается и где заканчивается PHP-код. Вот простой пример PHP-страницы:

```

Пример PHP

Встречайте, PHP!

```

В этом примере PHP-код встроен в теги PHP от ``. Внутри этих тегов выполняется оператор echo "Привет, мир!", и на сайте выводится "Привет, мир!".

В PHP существуют различные типы переменных, которые начинаются со знака доллара ($), за которым следует имя переменной, например, $name, $age, $price. PHP также поддерживает различные типы данных, такие как String, Integer, Array и Boolean.

PHP также поддерживает различные типы управляющих структур, такие как ветвления (if/else) и циклы (for/while), которые позволяют управлять потоком выполнения программы и повторять выполнение утверждений.

Функции — важная часть синтаксиса PHP, позволяющая писать многократно используемый код. Функции могут принимать аргументы и возвращать значения.

PHP также поддерживает объектно-ориентированное программирование (ООП) и использование классов и объектов, что позволяет создавать более сложные приложения и повышает удобство повторного использования кода.

В целом, базовый синтаксис PHP прост и интуитивно понятен, что дает разработчикам множество возможностей для создания динамичных и эффективных приложений. Однако для успешной разработки приложений важно понимать синтаксис и различные функции PHP.

## 2. Переменные и типы данных
### Скалярные типы данных

В PHP существует четыре скалярных типа данных: булевы (логические) (`bool`), целочисленные значения (`int`), значения с плавающей точкой (`float`) и строковые (`string`).

**Булево значение:** тип данных Boolean может быть либо истинным, либо ложным. Он используется для хранения и проверки логических условий.

```
$is_true = true;
$is_false = false;
```

**Целое число:** Тип данных Integer представляет целое число. Он может иметь положительные или отрицательные значения и поддерживает обычные арифметические операции.

```
$age = 25;
$result = $age + 10;
```

**Float:** Тип данных Float представляет число с плавающей точкой. Он поддерживает обычные арифметические операции и может принимать как положительные, так и отрицательные значения.

```
$pi = 3.14;
$result = $pi * 2;
```

**String:** Тип данных String представляет символьную строку. Он может содержать текст и символы и поддерживает множество методов манипулирования и обработки текста.

```
$name = "Алиса";
$message = "Привет, " . $name;
```

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

`$variable = null;`

Важно отметить, что PHP, будучи языком со слабой динамической типизацией, **автоматически определяет и преобразует типы данных**, однако важно использовать правильные типы данных для конкретных задач, чтобы избежать ошибок и проблем с обработкой данных. Также важно понимать разницу между типами данных при выполнении арифметических или логических операций.

### Массивы

В PHP массивы — это распространенная структура данных, позволяющая хранить несколько значений под одним именем. Массивы могут быть как числовыми, так и ассоциативными и содержать различные типы данных.

**Числовой массив** использует индекс, автоматически генерируемый PHP, для идентификации элементов массива. Индекс начинается с 0, и доступ к элементам можно получить по их индексу.

```
$numbers = array(1, 2, 3, 4, 5);

echo $numbers[0]; // выводит 1
```

**Ассоциативный массив** использует ключ, указанный разработчиком, для идентификации элементов массива. Ключ может быть строкой или числом, а доступ к элементам осуществляется по их ключу.

```
$users = array("name" => "Алиса", "age" => 25, "email" => " alice@example.com ");

echo $user["name"]; // выводит "Алиса".
```

Массивы в PHP также поддерживают многомерные массивы, что означает, что массив может содержать элементы, которые сами являются массивами.

```
"Алиса", "age" => 25),
  array("name" => "Боб", "age" => 30),
  array("name" => "Чарли", "age" => 35)
);
echo $family[1]["name"]; // выводит "Боб".
?>
```

PHP также предоставляет множество функций и методов, позволяющих создавать, манипулировать и обрабатывать массивы. Вот некоторые примеры:
- `array_push()` для добавления элементов в конец массива
- `array_pop()` для удаления последнего элемента массива
- `count()` для получения количества элементов в массиве
- `sort()` для сортировки элементов массива
- `implode()` для преобразования массива в строку.
Массивы являются мощным инструментом в PHP и могут использоваться для создания и управления сложными структурами данных. Однако для успешной работы с массивами важно понимать синтаксис и доступные функции и методы.

### Объекты

В PHP объекты являются важной концепцией объектно-ориентированного программирования (ООП) и позволяют создавать более сложные приложения и повышать степень повторного использования кода.

Объект в PHP — это экземпляр класса, который содержит набор переменных и функций (также называемых методами). Класс — это шаблон или "чертеж" для создания объектов, который определяет структуру и поведение объектов.

Вот пример создания класса "Car" и создания объекта на его основе:

```
class Car
{
  public $brand;
  public $model;
  public $color;
  public function description()
  {
    return "Это машина " . $this->color . " " . $this->brand . " " . $this->model;
  }
}
$myCar = new Car();
$myCar->brand = "Форд";
$myCar->model = "Мустанг";
$myCar->color = "красный";
echo $myCar->description(); // выводит "Это машина красный Форд Мустанг".
```

В этом примере создается класс "Car", содержащий три переменные ($brand, $model, $color) и метод (`description()`). Затем создается объект "myCar" путем создания экземпляра класса "Car" с помощью ключевого слова "new". После этого переменным объекта присваиваются значения, а метод `description()` вызывается для печати описания автомобиля.

В PHP класс также может содержать конструкторы и деструкторы, которые автоматически вызываются при создании и уничтожении объектов. Наследование и полиморфизм также могут быть использованы для повышения удобства повторного использования кода и упрощения структуры приложения.

Наследование позволяет классу наследовать свойства и методы другого класса. Это позволяет иметь общий базовый класс, содержащий общие свойства и методы, а затем создавать более специализированные подклассы, наследующие от этого базового класса.

```
class Vehicle
{
  public $brand;
  public $model;
}
class Auto extends Vehicle
{
  public $color;
}
$myCar = new Car();
$myCar->make = "Форд";
$myCar->model = "Мустанг";
$myCar->color = "красный";
```

Полиморфизм позволяет иметь методы с одинаковым именем в разных классах, но выполняющие разные задачи.

```
class Rectangle
{
  public $width;
  public $length;
  public function calculateArea()
  {
    return $this->width * $this->length;
  }
}

class Circle
{
  public $radius;
  public function calculateArea()
  {
    return pi() * pow($this->radius, 2);
  }
}
```

Объектно-ориентированное программирование позволяет создавать сложные приложения ясным и структурированным способом, а также повышать повторное использование кода. Однако важно понимать концепции ООП, такие как наследование, полиморфизм и различия между классами и объектами, чтобы успешно создавать объектно-ориентированные приложения.

## 3. Управляющие структуры (конструкции)

### Ветвления (if/else)

В PHP ветвления могут использоваться для управления потоком выполнения программы и выполнения определенных операторов только при определенных условиях. Наиболее часто используемой конструкцией ветвления является оператор if/else.

Оператор if проверяет, истинно ли заданное условие. Если условие истинно, выполняются операторы внутри оператора if. Если условие ложно, операторы внутри оператора if пропускаются.

```
$age = 25;
if ($age > 18) {
  echo "Вы достигли совершеннолетия.";
}
```

Оператор else может использоваться для выполнения других операторов, когда условие в if ложно.

```
$age = 15;
if ($age > 18) {
  echo "Вы достигли совершеннолетия.";
} else {
  echo "Вы несовершеннолетний (-яя).";
}
```

Также можно объединять несколько условий для создания более сложных ветвлений с помощью оператора elseif.

```
$note = 75;
if ($note >= 90) {
  echo "Отлично";
} elseif ($note >= 80) {
  echo "Хорошо";
} elseif ($note >= 70) {
  echo "Удовлетворительно";
} else {
  echo "Неудовлетворительно";
}
```

Существует также тернарная запись, которая может использоваться аналогично сокращению операторов if-else. Она состоит из условия, за которым следует вопросительный знак (?), затем значение, которое нужно вернуть, если условие истинно, и двоеточие (:), за которым следует значение, которое нужно вернуть, если условие ложно.

```
$note = 75;
echo ($note >= 70) ? "Сдан" : "Не сдан";
```

Ветвления — важная конструкция в программировании, которая позволяет управлять потоком выполнения программы и выполнять определенные инструкции только при определенных условиях. Важно понимать синтаксис операторов if/else и других конструкций ветвления, а также убедиться, что условия написаны и протестированы правильно, чтобы получить ожидаемые результаты.

### Циклы (for/while)

В PHP циклы могут использоваться для многократного выполнения заданного оператора или набора операторов, пока выполняется определенное условие. Существует два основных типа циклов: цикл for и цикл while.

Цикл for предназначен в первую очередь для выполнения заданного количества итераций. Он состоит из трех частей: инициализации, условия и обновления.

```
for ($i = 1; $i <= 10; $i++) {
  echo $i;
}
```

Этот пример использует цикл for для вывода чисел от 1 до 10. Часть инициализации устанавливает начальную переменную $i равной 1, условие $i <= 10 проверяет, должен ли цикл продолжаться, а часть обновления увеличивает переменную $i на 1 после каждой итерации.

Цикл while, с другой стороны, предназначен для выполнения до тех пор, пока условие не перестанет выполняться.

```
$i = 1;
while ($i <= 10) {
  echo $i;
  $i++;
}
```

Этот пример использует цикл while для вывода чисел от 1 до 10. Часть инициализации устанавливает начальную переменную $i равной 1, условие $i <= 10 проверяет, должен ли цикл продолжаться, а часть обновления увеличивает переменную $i на 1 после каждой итерации.

Также существует цикл do-while, который сначала выполняет тело цикла, а затем проверяет условие.

```
$i = 0;
do {
  echo $i;
  $i++;
} while ($i <= 10);
```

Циклы — важная конструкция в программировании, которая позволяет выполнять определенные операторы повторно, пока выполняется определенное условие. Важно понимать синтаксис циклов for и while, а также других конструкций циклов, и убедиться, что условия написаны и протестированы правильно, чтобы достичь ожидаемых результатов и избежать бесконечных циклов.

## 4. Функции

### Создание функций

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

Вот пример создания функции "`welcome()`", которая выводит текст на страницу:

```
function welcome()
{
  echo "Добро пожаловать на наш сайт!";
}
```

Чтобы вызвать эту функцию, достаточно написать имя функции в вашем коде и вызвать ее с круглыми скобками:

```
welcome();
```

Функции также могут иметь параметры, которые содержат значения, передаваемые функции при ее вызове. Следующий пример создает функцию `greet($name)`, которая вставляет переданное имя в приветствие:

```
function greet($name)
{
  echo "Добро пожаловать, " . $name . "!";
}

greet("Алиса"); // возвращает "Добро пожаловать, Алиса!"
```

Функция также может иметь значение, которое возвращается вызывающему коду после выполнения функции. Чтобы определить возвращаемое значение, нужно использовать ключевое слово '`return`'. Следующий пример создает функцию `add($a, $b)`, которая вычисляет и возвращает сумму $a и $b:

```
function add($a, $b)
{
  return $a + $b; // возвращает сумму $a и $b
}
$result = add(3, 4);

echo $result; // выводит "7"
```

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

### Передача аргументов

В PHP аргументы могут передаваться функциям для передачи конкретных значений или переменных функции, которая использует их для своих вычислений или действий. Аргументы указываются в круглых скобках после имени функции и могут передаваться либо как фиксированные значения, либо как переменные. Примером передачи аргументов функции является следующая функция '`add($a, $b)`', которая вычисляет и возвращает сумму $a и $b:

```
function add($a, $b)
{
  return $a + $b;
}
$result = add(3, 4); // передаем аргументы

echo $result; // выводит "7"
```

В этом примере аргументы 3 и 4 передаются функции add() и используются как переменные $a и $b внутри функции.

Аргументы также могут передаваться как переменные, как в следующем примере:

```
$x = 3;
$y = 4;
$result = add($x, $y);

echo $result; // выводит "7".
```

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

```
function add($a, $b = 0)
{
  return $a + $b;
}
$result = add(5);

echo $result; // выведет "5", т.к. $b по умолчанию равно 0
```

Важно отметить, что при передаче аргументов количество и порядок аргументов должны точно соответствовать количеству и порядку параметров в объявлении функции. Тип данных передаваемых аргументов также должен соответствовать типу данных параметров.

### Возвращаемые значения

В PHP функции могут иметь значение, которое возвращается вызывающему коду после выполнения функции. Возвращаемое значение может быть любого типа данных, включая скалярные значения, массивы и даже объекты.

Чтобы определить возвращаемое значение, нужно использовать ключевое слово '`return`'. Оператор return может использоваться в любом месте функции для завершения ее выполнения и возврата возвращаемого значения.

Вот пример уже известной нам функции `add($a, $b)`, которая вычисляет и возвращает сумму $a и $b:

```
function add($a, $b)
{
  return $a + $b; // $a + $b в данном случае и есть возвращаемое значение
}
$result = add(3, 4);

echo $result; // выводит "7"
```

Важно отметить, что функция может иметь только одно возвращаемое значение, и как только это значение возвращено, выполнение функции прекращается.

Также возможно, что функция не имеет явного возвращаемого значения, в этом случае возвращается null неявно.

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

```
function multiple_values()
{
  return array(1, "Привет", 3.14);
}
$values = multiple_values();

print_r($values);

/*
выведет массив:
Array
(
[0] => 1
[1] => Привет
[2] => 3.14
)
*/

```

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

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

## 5. Работа с базами данных

### Установление соединения

Установление соединения с базой данных в PHP обычно выполняется с использованием PHP Data Objects (PDO). PDO — это расширение PHP, которое позволяет подключаться к различным базам данных и выполнять запросы.

Для подключения к базе данных сначала нужно включить расширение PDO в PHP, а затем создать новый экземпляр PDO с помощью конструктора класса. Конструктор принимает три аргумента: драйвер базы данных, строку подключения к базе данных и имя пользователя и пароль базы данных.

Вот пример создания соединения с базой данных MySQL:

```
$pdo = new PDO('mysql:host=hostname;dbname=databasename', 'username', 'password');
```

Этот пример использует драйвер MySQL, и строка подключения указывает имя хоста и имя базы данных. Также предоставляются имя пользователя и пароль.

Важно отметить, что строка подключения может различаться в зависимости от используемого драйвера базы данных.
Например, для подключения к базе данных PostgreSQL:

```
$pdo = new PDO('pgsql:host=hostname;dbname=databasename', 'username', 'password');
```

После установления соединения вы можете отправлять запросы к базе данных и выполнять запросы или изменять данные. В классе PDO есть несколько методов, которые можно использовать для выполнения запросов, таких как метод `query()` для простых запросов и метод `prepare()` для подготовленных запросов.

Также можно настроить обработку ошибок для соединения, соответствующим образом настроив атрибуты объекта PDO. Например, обработку ошибок можно переключить на исключения вместо кодов ошибок, установив атрибут PDO::ATTR_ERRMODE в значение PDO::ERRMODE_EXCEPTION.

```
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
```

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

Существует несколько способов закрыть соединение, наиболее часто используемый метод — установка экземпляра PDO в null, например:

```
$pdo = null;
```

Также существует возможность закрыть соединение с помощью метода, такого как `close()` или `disconnect()`, в зависимости от используемой библиотеки базы данных.

Важно убедиться, что все незавершенные транзакции завершены и все открытые курсоры закрыты перед закрытием соединения.

При работе с базами данных важно убедиться, что соединение установлено и закрыто правильно, чтобы избежать проблем в приложении и оптимизировать производительность и безопасность базы данных.

### Запросы

В PHP запросы могут быть отправлены в базу данных с использованием PHP Data Objects (PDO) после успешного установления соединения. В классе PDO есть несколько методов, которые можно использовать для выполнения запросов, таких как метод `query()` для простых запросов и метод `prepare()` для подготовленных запросов.

Метод `query()` можно использовать для отправки простого SELECT-запроса в базу данных и возврата результата в виде объекта PDOStatement. Вот пример использования метода `query()` для выбора всех записей из таблицы '`users`':

```
$stmt = $pdo->query('SELECT * FROM users');
```

Метод `prepare()` может использоваться для подготовки запроса перед его выполнением. Это полезно, когда нужно выполнить запрос несколько раз или когда хочется привязать параметры к запросу, чтобы избежать SQL-инъекций. Вот пример использования метода `prepare()` для подготовки SELECT-запроса с привязанными параметрами:

```
$stmt = $pdo->prepare('SELECT * FROM users WHERE age > ?');
$stmt->execute([25]);
```

В этом примере запрос подготавливается с использованием заполнителя '?' для значения возраста. Значение 25 затем передается методу `execute()`, чтобы быть привязанным к заполнителю и выполнить запрос.

Также существуют методы для вставки, обновления и удаления данных в базе данных, такие как `exec()` для простых операторов и `prepare()` и `execute()` для подготовленных операторов.

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

### CRUD-операции (Create, Read, Update, Delete)
**Операции CRUD (Создание, Чтение, Обновление, Удаление)**

**Операции CRUD** (Создание, Чтение, Обновление, Удаление) — это основные операции, которые могут быть выполнены с базой данных. Эти операции могут быть выполнены в PHP с использованием PHP Data Objects (PDO) после успешного установления соединения.

**Create (Создание): Вставка данных в таблицу.**

```
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute(["Джон", 30]);
```

**Read (Чтение): Запрос данных из таблицы.**

```
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll();
```

**Update (Обновление): Изменение данных в таблице.**

```
$stmt = $pdo->prepare("UPDATE users SET age = ? WHERE name = ?");
$stmt->execute([35, "Джон"]);
```

**Delete (Удаление): Удаление данных из таблицы.**

```
$stmt = $pdo->prepare("DELETE FROM users WHERE name = ?");
$stmt->execute(["John"]);
```

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

Транзакция — это группа запросов, которые либо все выполняются успешно, либо не оказывают никакого влияния на базу данных.

Важно правильно использовать транзакции, чтобы обеспечить целостность данных.

## 6. Безопасность

### Избегание SQL-инъекций

**SQL-инъекции** являются распространенной проблемой безопасности в приложениях, использующих базы данных. Они позволяют злоумышленникам внедрить вредоносный код в приложение и тем самым скомпрометировать или даже захватить базу данных.

Существует несколько способов избежать SQL-инъекций в PHP:

**Использование привязанных параметров:**
Вместо того чтобы строить запросы напрямую с использованием ввода пользователя, можно использовать привязанные параметры для безопасного выполнения запросов. Это предотвращает внедрение вредоносного кода в запрос.

**Использование подготовленных операторов:**
Подготовленные операторы — это еще один способ безопасного выполнения запросов. Они позволяют подготовить запросы перед выполнением и привязать ввод пользователя к привязанным параметрам.

**Использование функций экранирования:**
Некоторые драйверы баз данных предоставляют функции экранирования, которые можно использовать для экранирования определенных символов во вводе пользователя перед их использованием в запросах.

**Проверка и очистка ввода:**
Важно убедиться, что ввод правильно отформатирован и проверен перед использованием. Также важно удалить или очистить небезопасные или вредоносные данные перед их использованием.

Важно серьезно относиться к безопасности вашего приложения и предпринимать все необходимые меры для избежания SQL-инъекций. Это включает регулярное обновление и проверку кода, чтобы он соответствовал последним рекомендациям по безопасности. Также важно регулярно проверять приложение на наличие потенциальных уязвимостей безопасности и устранять их.

### Шифрование

Шифрование — это важный аспект безопасности данных, используемый для защиты данных от несанкционированного доступа и неправильного использования. Существует несколько способов шифрования данных в PHP, включая:

**Симметричное шифрование:**
При симметричном шифровании один и тот же ключ используется как для шифрования, так и для дешифрования. Примером этого является использование расширения OpenSSL в PHP и алгоритма шифрования AES.

```
$plaintext = "Мой секретный текст";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));

// Шифрование
$ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, 0, $iv);

// Дешифрование
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $key, 0, $iv);

echo "Original text: " . $plaintext . "\n";
echo "Encrypted text: " . $ciphertext . "\n";
echo "Decrypted text: " . $decrypted . "\n";

/*

Вывод будет следующим:
Original text: Мой секретный текст
Encrypted text: t3qLkPjXPdSsejZpVesbZIo9wLOZfRc1/9IgrR0W+Xf+2V+jn6HKo3aTMo27OKvO
Decrypted text: Мой секретный текст

*/
```

**Асимметричное шифрование:**
Асимметричное шифрование использует два ключа: публичный ключ и приватный ключ. Публичный ключ используется для шифрования данных, а приватный ключ — для их дешифрования. Примером этого является использование шифрования RSA.

```
// Исходный текст
$plaintext = "Мой секретный текст";

// Генерация пары ключей RSA
$config = array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);

// Извлечение публичного ключа
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res)['key'];

// Шифрование данных с использованием публичного ключа
openssl_public_encrypt($plaintext, $encrypted, $publicKey);

// Дешифрование данных с использованием приватного ключа
openssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo "Original text: " . $plaintext . "\n";
echo "Encrypted text: " . base64_encode($encrypted) . "\n"; // Зашифрованный текст в base64 для удобства чтения
echo "Decrypted text: " . $decrypted . "\n";

/*

Вывод будет следующим:
Original text: Мой секретный текст
Encrypted text: pao8crajoxdn0ePPoh176EQmjRUGu6og+DqUAfdar3Y5PClG/iHyc83NB+txUQO4KyWUf9ye6IHfQAwUGZXYdQHNJJF+JTWOi0MbBvqSwW/FTXJsaAbHmH09dMrnp0yCyrwA2XY0N6q931aeSA/c9AewZrUcAX50kXG9ALaBkRV0Jk/vW23SP/QnAxDVEKUzcDC3b8BYm1UfeZT4JJ7aHLOUYwe81cZXueRhlBUKY/fCM2JVi4SpwnAjK/5sbTT2Rplczz+wcInJ7EaqK/DV2OXJkmhH2en4dhMRu0jpA9GhtLWrhED19eZynBev4usyre9h/bP8to6gSBJw5p9MQg==
Decrypted text: Мой секретный текст

*/
```

**Хеш-функции:**
Хеш-функции могут использоваться для преобразования данных в строку нечитаемых символов. Хеш-функции являются односторонним шифрованием, поскольку исходные данные не могут быть восстановлены после их хеширования. Примером этого является использование SHA-256 в PHP:

```
$plaintext = "Мой секретный текст";
$hash = hash('sha256', $plaintext);

echo "Original text: " . $plaintext . "\n";
echo "Hashed text: " . $hash . "\n";

/*

Вывод будет следующим:
Original text: Мой секретный текст
Hashed text: 445a84930bd4673869eeb0b0cadb1cd4b529c7b912a876aaa25381cf7a8f30c6

*/
```

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

Существуют также фреймворки, такие как `libsodium` или `paragonie`/`sodium_compat`, которые рекомендуются для повышения безопасности и упрощения шифрования.

## 7. Обработка ошибок

### Обработка исключений

**Обработка исключений** — это важный аспект отладки в PHP. Она позволяет разработчикам реагировать на ошибки или исключительные ситуации, которые возникают, вместо того чтобы позволять приложению полностью выйти из строя.

В PHP исключения могут быть обработаны с помощью блока try-catch. Блок `try` содержит код, который может вызвать исключение, а блок `catch` содержит код, который выполняется, когда происходит исключение.

```
try {
  // Код, который может вызвать исключение
} catch (Exception $e) {
  // Код для выполнения при возникновении исключения
}
```

PHP также имеет возможность использовать несколько блоков `catch` для реагирования на разные типы исключений. Это может быть полезно, если вы хотите, чтобы приложение реагировало по-разному на разные типы исключений.

```
try {
  // Код, который может вызвать исключение
} catch (InvalidArgumentException $e) {
  // Код для выполнения при возникновении InvalidArgumentException
} catch (RuntimeException $e) {
  // Код для выполнения при возникновении RuntimeException
} catch (Exception $e) {
  // Код для выполнения при возникновении другого исключения
}
```

Также возможно определять исключения в своих собственных классах, чтобы обеспечить возможность реагирования приложения на определенные типы исключений.

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

Также рекомендуется реализовать систему для автоматического логирования ошибок и упрощения устранения неполадок.

Выбор правильной обработки исключений важен для поддержания стабильности приложения и упрощения отладки. Например, исключение, указывающее на проблему в логике приложения, должно быть обработано, и приложение должно быть приведено в стабильное состояние, тогда как исключение, указывающее на проблему с окружением, должно быть залогировано, и приложение должно быть завершено для упрощения устранения неполадок.

Также важно, чтобы обработка исключений не использовалась для сокрытия или игнорирования ошибок. Любая ошибка должна быть тщательно исследована и исправлена, чтобы обеспечить стабильность приложения и сохранение безопасности данных.

Существуют также фреймворки, такие как Monolog, которые могут упростить и улучшить обработку ошибок и логирование.

### Сообщения об ошибках

**Сообщения об ошибках** — это важная часть устранения неполадок в PHP. Они предоставляют разработчикам важную информацию об ошибках, возникающих в приложении, и помогают им определить причину ошибки и исправить её.

PHP предоставляет несколько типов сообщений об ошибках, включая:

**Уведомления (Notices):** Уведомления — это сообщения об ошибках, которые указывают на проблемы, которые не обязательно влияют на правильность кода, но могут привести к неожиданному поведению. Например, предупреждение может быть выдано, если переменная не определена перед её использованием.

**Предупреждения (Warnings):** Предупреждения — это сообщения об ошибках, которые указывают на проблемы, которые могут влиять на правильность кода, но не прерывают выполнение приложения. Например, предупреждение может быть выдано, если файл не может быть найден.

**Фатальные ошибки (fatal errors:):** Фатальные ошибки — это сообщения об ошибках, которые прерывают выполнение приложения. Например, фатальная ошибка может возникнуть, если функция не определена или есть синтаксическая ошибка.

Существует несколько способов настройки и отображения сообщений об ошибках в PHP. Настройки могут быть сделаны в файле php.ini, где можно задать параметры отчетности об ошибках.

Также возможно программно настраивать и отображать сообщения об ошибках с использованием функций PHP `error_reporting()`, `ini_set()` и `trigger_error()`. Например, разработчик может установить отчетность об ошибках на "E_ALL" во время разработки, чтобы отображать все сообщения об ошибках, а затем изменить эту настройку на "E_ERROR" или "E_WARNING", чтобы отображать только серьезные сообщения об ошибках, когда приложение работает в продакшн-среде.

Важно тщательно отслеживать и анализировать сообщения об ошибках, чтобы убедиться, что нет необработанных ошибок и что приложение остается стабильным. Также важно безопасно обрабатывать сообщения об ошибках, не раскрывая их пользователям или злоумышленникам, чтобы обеспечить безопасность данных.

Вышеупомянутый Monolog может в этом помочь. Также существуют сервисы, такие как Sentry, которые позволяют автоматически логировать ошибки и упрощают устранение неполадок.

## 8. Продвинутые концепции

### Классы и объектно-ориентированное программирование

**Классы и объектно-ориентированное программирование** — это важные концепции в программировании, особенно в PHP.

**Классы** — это шаблоны для объектов, которые имеют определенные свойства и поведение.

**Объекты** — это экземпляры классов и содержат фактические значения для свойств и поведения.

В PHP классы могут быть определены с использованием ключевого слова "`class`". Класс содержит свойства (также называемые полями или переменными) и методы (также называемые функциями). Свойства описывают состояния объекта, тогда как методы описывают действия, которые объект может выполнять.

Пример простого класса в PHP может выглядеть следующим образом:

```
class Person
{
  public $name;
  public $age;
  public function sayHello()
  {
    return "Привет, меня зовут $this->name и мне $this->age лет.";
  }
}
```

Чтобы создать объект из класса, используйте ключевое слово "new" и укажите имя класса:

```
$person = new Person();

$person->name = "Иван Иванов";

$person->age = 30;

echo $person->sayHello();
```

В этом примере мы создаем новый объект с именем $person из класса Person. Затем мы устанавливаем свойства объекта в определенные значения и вызываем метод `sayHello()`, который выводит приветственное сообщение.

PHP также имеет такие концепции, как наследование, полиморфизм, абстрактные классы и интерфейсы, которые расширяют объектно-ориентированное программирование и улучшают повторное использование и структурирование кода.

Существуют также фреймворки, такие как Laravel, которые упрощают и улучшают создание классов и объектов.

Важно обеспечить, чтобы классы и объекты были спроектированы чисто и эффективно, чтобы улучшить поддерживаемость и производительность приложения.

### Пространства имен

**Пространства имен** — это важная концепция в PHP, которая позволяет логически группировать классы, функции и константы и защищать их от конфликтов с другими классами, функциями и константами.
Пространства имен также позволяют разработчикам использовать несколько версий одного и того же класса или функции в приложении.

Пространства имен в PHP определяются с использованием ключевого слова "`namespace`" и могут использоваться для классов, а также для функций и констант.
Пример использования пространств имен для класса может выглядеть следующим образом:

```
namespace MyApp\Models;

class User
{
  // код класса
}
```

В этом примере класс `User` включен в пространство имен `MyApp\Models`. Чтобы получить доступ к классу `User`, необходимо указать полное пространство имен:

```
$user = new MyApp\Models\User();
```

Также возможно определить элиас (alias, псевдоним), чтобы сократить пространство имен:

```
use MyApp\Models\User as MyUser;
$user = new MyUser();
```

Также существует возможность импортировать пространства имен динамически с помощью функции "`use`":

```
use function MyApp\Math\add;
$result = add(1,2);
```

Пространства имен полезны для поддержания кода организованным и легко поддерживаемым. Важно тщательно планировать использование пространств имен в приложении, чтобы код был легко понятен и поддерживаем.

Также важно обеспечить уникальность и описательность пространств имен, чтобы избежать конфликтов и улучшить читаемость кода. Важно также обеспечить согласованность пространств имен и имен классов, чтобы улучшить поддерживаемость и производительность приложения.

Важно обеспечить, чтобы пространства имен использовались не только для решения проблем, но и для улучшения структурирования и повторного использования кода. Пространства имен — это мощный инструмент для поддержания кода организованным и легко поддерживаемым.

### События и обратные вызовы

**События (events) и обратные вызовы (callbacks)** — это важные концепции в программировании, особенно в PHP.

**События** — это действия, которые вызываются в приложении, такие как нажатие кнопки или загрузка страницы.

**Обратные вызовы** — это функции или методы, которые вызываются при возникновении определенного события.

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

**Слушатели событий (event listeners)** — это классы или функции, которые реагируют на определенные события и выполняют определенное действие.

**Эмиттеры событий (event emitters)** — это классы или объекты, которые вызывают события и уведомляют слушателей событий.

Пример использования событий и обратных вызовов в PHP может выглядеть следующим образом:

```
class User
{
  protected $events;
  public function __construct()
  {
    $this->events = new EventEmitter();
  }
  public function register()
  {
    // код для регистрации пользователя
    $this->events->emit('user.registered', $this);
  }
}

$user = new User();
$user->events->on('user.registered', function ($user) {
  // отправка e-mail
});
$user->register();
```

В этом примере у нас есть класс `User`, который имеет `EventEmitter`. Когда пользователь регистрируется, вызывается событие '`user.registered`', которое перехватывается слушателем событий. Слушатель событий — это анонимная функция, которая автоматически вызывается, когда возникает событие `'user.registered`'. В этом случае анонимная функция отправляет приветственное письмо зарегистрированному пользователю.

Также существуют фреймворки, такие как Symfony EventDispatcher, которые упрощают и улучшают использование событий и обратных вызовов.

Важно обеспечить, чтобы события и обратные вызовы были реализованы чисто и эффективно, чтобы улучшить поддерживаемость и производительность приложения. Также важно, чтобы события и обратные вызовы использовались осмысленно и логично в приложении, чтобы улучшить читаемость и понятность кода.

## 9. Расширения и внешние библиотеки

### Использование Composer

**Composer** — это менеджер пакетов для PHP, который позволяет разработчикам управлять и автоматически загружать зависимости между различными PHP-пакетами. Он позволяет разработчикам включать внешние библиотеки и фреймворки в свои приложения без необходимости вручную управлять зависимостями.

Для использования Composer в проекте его сначала нужно установить. После установки к нему можно получить доступ из командной строки. Первый шаг — создать файл с именем "`composer.json`" в корне проекта. Этот файл содержит информацию о том, какие зависимости требуются для проекта.

Пример файла `composer.json` может выглядеть следующим образом:

```
{
  "require": {
    "monologue/monologue": "^2.0",
    "phpunit/phpunit": "^8.5"
  }
}
```

В этом примере проект требует библиотек Monolog и PHPUnit указанной версии или выше.

Для установки зависимостей можно использовать команду "`composer install`". Composer затем загрузит необходимые пакеты и установит их в директорию с именем "`vendor`" в каталоге проекта.

Для обновления или удаления пакета можно использовать команды "`composer update`" или "`composer remove`".

Composer позволяет разработчикам организовывать свой код чисто и эффективно, автоматически управляя зависимостями и обеспечивая использование правильных версий библиотек. Это также облегчает сотрудничество с другими разработчиками, так как гарантирует, что все используют одни и те же версии библиотек.

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

Важно обеспечить, чтобы используемые пакеты всегда были актуальными и не имели известных уязвимостей в безопасности. Composer также предоставляет возможность автоматически получать предупреждения о безопасности при обновлении используемых пакетов.

В целом, Composer — это очень полезный инструмент для разработчиков PHP, так как он упрощает управление зависимостями и делает разработку приложений более эффективной и простой.

### Интеграция внешних библиотек

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

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

Другой вариант — использование менеджера пакетов, такого как Composer, для автоматического управления зависимостями и загрузки правильных версий библиотек. С помощью Composer разработчики могут определить зависимости в файле `composer.json` и загружать и обновлять библиотеки одной простой командой.

Еще один вариант — использование автозагрузки библиотек, например, **PSR-4**, которая позволяет автоматически загружать классы по мере необходимости. Это позволяет уменьшить количество ручных включений или требований и улучшить читаемость и поддерживаемость кода.

Важно отметить, что внешние библиотеки всегда должны проверяться перед использованием, особенно на предмет безопасности и поддержки. Также важно убедиться, что используемые библиотеки совместимы с текущей версией PHP и с проектом.

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

В целом, интеграция внешних библиотек — это важная часть разработки на PHP и может помочь сократить время разработки и улучшить производительность и поддерживаемость приложения. Однако важно убедиться, что используемые библиотеки безопасны, хорошо поддерживаются и совместимы, чтобы избежать проблем и обеспечить производительность приложения.

## Информация

Оригинал этой книги был опубликован под лицензией Creative Commons Attribution-NonCommercial-NoDerivatives (CC BY-NC-ND).

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

*Автор:* Michael Lappenbusch

*Электронная почта:* [admin@perplex.click](mailto:admin@perplex.click)

*Домашняя страница:* [https://www.perplex.click](https://www.perplex.click/)

*Год выпуска:* 2023

Некоторый контент взят из: ChatGPT.

### Перевод

Перевод был выполнен в 2024 году с согласия автора оригинала.
Были исправлены некоторые фактологические ошибки и опечатки, локализованы примеры кода для русскоязычных читателей, добавлены примеры вывода для наглядности, а также ссылки на ресурсы.

## Ссылки

| № п/п | Материал | Ссылка |
| ----- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1. | Оригинал материала на Internet Archive | [Ссылка](https://archive.org/details/effektive-php-entwicklung-mit-tipps-und-tricks/Effective%20PHP%20development%20with%20tips%20and%20tricks/mode/2up) |
| 2. | Оригинал материала (eng .pdf) | [Ссылка](https://ia804705.us.archive.org/4/items/effektive-php-entwicklung-mit-tipps-und-tricks/Effective%20PHP%20development%20with%20tips%20and%20tricks.pdf) |
| 3. | Документация по PHP | [Ссылка](https://www.php.net/manual/ru/index.php) |
| 4. | PSR-4: Autoloader | [Ссылка](https://www.php-fig.org/psr/psr-4/) |
| 5. | Composer | [Ссылка](https://getcomposer.org/) |