Собеседование Flashcards
Вопросы по PHP, SQL, методологиям и т.д.
Типы данных в PHP
Скалярные типы:
* int (целочисленное значение)
* bool (логический тип true/false)
* float (число с плавающей точкой)
* string (строка)
Смешанные типы:
* array (массив)
* object (объект)
Специальные типы:
* null
* resource (перемення, хранящая ссылку на внешний ресурс. например: соединение с БД, работа с файлами fopen(), fgets(), fclose())
Псевдотипы:
* never (возвращаемое значение, которое указывает, что функция прекратила работу без возврата значения)
* void (возвращаемое значение, которое указывает, что функция ничего не возвращает)
* mixed (любой тип)
* callable (функции или метод, который можно вызвать. Например, array_map(callable, array))
* iterable (массив или объект, поддерживающий итерацию. используется в функциях и методах, которые могут обрабатывать различные коллекции данных (массивы или итераторы. Пример: цикл foreach)
Плюсы строгой типизации
- раннее обнаружение ошибок (нахождение ошибок на ранних этапах разработки, когда типы данных не соответствуют ожиданиям)
- улучшение читаемости и поддерживаемости кода (более предсказуемый код)
- инструменты статического анализа помогают проверять код и предотвращать ошибки до выполнения (Psalm, PHPStan)
- явное поведение функций
Минусы строгой типизации
- меньшая гибкость (отключение атоматического приведения типов)
- сложность при интеграции с библиотеками и API, не использующими строгую типизацию
- дополнительные проверки валидации и приведения типов
Какая типизация используется в PHP?
В PHP используется динамическая слабая типизация
Динамическая - не требует явного указания типа при объявлении переменной
Слабая - присутствует автоматическое приведение типов
Можно включить строгую типизацию для функций и методов, используя declare(strict_types=1)
. В этом режиме PHP требует, чтобы передаваемые значения строго соответствовали указанным типам данных и не пытался автоматически их преобразовать.
Приведение типов данных в PHP
В PHP типы данных могут приводиться явно ($i = (int) $a) или неявно (автоматически)
В любом из случаев можно столкнуться с ошибкой (например: при попытке перевести объект/массив/ресурс к скалярному типу)
Лучшие практики именования переменных
- понятные и осмысленные имена
- единый стиль именования (camelCase/snake_case)
- избегать общих имён (data, object)
- использовать имена, отражающие тип данных ($is/can/has.. для bool, $..Count для int)
- использование множественных чисел для массивов и коллекций
Переменные начинаются с $, имя которой начинается с буквы или символа подчёркивания _. Имена могут содержать только буквы, цифры и подчёркивания
Области видимости переменных
- Глобальная (переменные вне функций, классов или методов имеют глобальную область видимости или объявленная с помощью global $a)
- Локальная (переменные объявленные внутри функций, видны и доступны только внутри функции)
- Статическая область видимости (объявляются внутри функции, сохраняют своё значение между вызовами функции)
Области видимости при описании классов
- public (свойство доступно как внутри класса, так и вне его)
- private (свойство доступно только внутри класса)
- protected (свойство доступно внутри класса и в его дочерних классах)
Константы и их использование в PHP
Константы используются для хранения значений, которые не должны изменяться (настройка конфигураций, магические числа/строки)
Константы объявляются с помощью const NAME = VALUE
, define("NAME", value)
Константы, объявленные с помощью define()
, доступны глобально, независимо от области видимости (даже внутри функций и методов классов).
Магические константы:
__LINE__ — номер текущей строки в файле.
__FILE__ — полный путь и имя текущего файла.
__DIR__ — директория текущего файла.
__FUNCTION__ — имя текущей функции.
__CLASS__ — имя текущего класса.
__TRAIT__ — имя текущего трейта.
__METHOD__ — имя текущего метода класса.
__NAMESPACE__ — текущее пространство имен.
PHP 8.3 и более поздние версии поддерживают объявление типа для констант PHP Class
Преимущества: неизменяемое значение, глобальная доступность,
Статические свойства
Свойства, которые принадлежат классу, а не его объектам. Все объекты класса разделяют одно и тоже значение статического свойства. Свойства сохраняются между вызовами методов.
Абстрактный класс
Класс, от которого нельзя создать объект. Предназначен для того, чтобы другие классы его наследовали.
Абстрактный класс может содержать как абстрактные методы, так и методы с реализацией. Наследники должны реализовать абстрактные методы
Может содержать свойства
Интерфейс
Интерфейс - набор методов без реализации, который должен реализовать класс, использующий его.
Интерфейс задаёт контракты, если класс реализует интерфейс, он обязан реализовать все методы, описанные в интерфейсе
Интерфейсы не содержат свойств
Разница между абстрактным классом и интерфейсом
- Абстрактный класс может содержать реализацию методов, а интерфейс нет
- Абстрактный класс может содержать свойства
- Класс может наследовать только 1 абстрактный класс, но может реализовывать несколько интерфейсов
- В абстрактном классе методы имеют разный уровень доступа (public/private/protected), все методы интерфейса должныть быть public
- Абстрактный класс может иметь конструктор
Абстрактный класс используется если: необходим общий базовый класс с общими свойствами и методами, когда есть частичная реализация, требуется определить общую функциональность для всех потомков
Интерфейс используется если: нужно задать набор методов, но без реализации, когда необходимо реализовать несколько интерфейсов
Что такое трейт в PHP?
Трейт — механизм для переиспользования кода в разных классах, не прибегая к наследованию.
Что такое функция и когда она используется?
Функция — это именованный блок кода, который можно вызвать в любом месте программы для выполнения конкретной задачи.
Основные характеристики функций:
- Именованный блок кода: Функция определяется один раз и может быть вызвана многократно в различных местах программы.
- Параметры: Функции могут принимать входные параметры, которые позволяют им работать с разными данными.
- Возвращаемое значение: Функция может возвращать результат выполнения, который может быть использован в коде.
Конструктор и деструктор
Конструктор — это метод класса, который автоматически вызывается при создании объекта. Он используется для выполнения начальной настройки объекта: присвоения значений свойствам, установления зависимостей и выполнения любой другой логики, необходимой при создании экземпляра класса.
Деструктор — это метод класса, который вызывается автоматически, когда объект уничтожается или выходит из области видимости. Обычно он используется для освобождения ресурсов (например, закрытие файлов, соединений с базами данных, освобождение памяти).
Деструктор не может быть вызван напрямую (как обычный метод) — он вызывается автоматически при удалении объекта или завершении скрипта.
Особенности переопределения родительских методов
Переопределение родительских методов (также называемое override) — это процесс, при котором метод, определённый в родительском классе, переопределяется в дочернем классе с целью изменения или дополнения его поведения.
При переопределении метода дочерний класс может вызвать оригинальную версию метода из родительского класса с помощью ключевого слова parent
При переопределении метода в дочернем классе его сигнатура (список параметров и возвращаемое значение) должна совпадать с сигнатурой метода в родительском классе, чтобы не нарушать полиморфизм.
Метод в родительском классе может быть помечен как final, что запрещает его переопределение в дочерних классах.
Исключения и преимущества их использования
Исключения в PHP — это механизм обработки ошибок и исключительных ситуаций, который позволяет прервать нормальный ход выполнения программы и перейти к коду, который может корректно обработать возникшую проблему
Исключение создается с помощью ключевого слова throw
Преимущества использования исключений
- Чёткое разделение логики и обработки ошибок
- Гибкость обработки ошибок
- Прерывание выполнения
- Поддержка сложных иерархий ошибок
Что такое сессия?
Чем отличается сессия от куки?
Как происходит связывание пользователя на сайте с сессией на сервере?
Сессия — это механизм хранения данных на стороне сервера, который позволяет веб-приложению сохранять информацию о пользователе на протяжении его взаимодействия с сайтом. Сессии используются для сохранения состояния между различными запросами, такими как авторизация, корзина покупок и другие пользовательские данные.
Отличие от куки:
- сессия хранится на сервере, а куки на клиенте
- сессия ограничена объёмом доступной памяти на сервере, куки обычно ограничены 4 Kb
- т.к. сессия хранится на сервере клиент не имеет к ней прямого доступа, тогда как куки могут быть доступны через JS или другие инструменты
- сессия живёт пока пользователь не закроет браузер или не истечёт срок хранения на сервере, кука хранится указанное время
Связывание пользователя с сессией на сервере происходит через идентификатор сессии (Session ID), который сервер создаёт при первом запросе пользователя и отправляет браузеру. Обычно этот идентификатор передаётся в куке или в URL, если куки отключены.
session_start();
// Запись данных в сессию
$_SESSION[‘username’] = “JohnDoe”;
$_SESSION[‘email’] = “john@example.com”;
// Получение данных из сессии
$_SESSION[‘username’];
// Очистка всех переменных сессии
session_unset();
// Уничтожение сессии
session_destroy();
Cookies: для чего, как и где использовать?
Cookies — это небольшие файлы данных, которые веб-сервер передаёт и сохраняет на компьютере пользователя через браузер. Они используются для хранения информации между запросами от клиента к серверу, что помогает поддерживать состояние сеансов, настраивать пользовательский интерфейс, а также сохранять персональные настройки.
- Поддержка сессий
- Хранение настроек (язык, тема, размер шрифта)
- Отслеживание действий
- Персонализация контента (показ товаров, которые уже просматривали)
// Создаём cookie с именем “user”, значением “John” и сроком действия 1 день
setcookie(“user”, “John”, time() + 86400, “/”);
// Читаем куки
$_COOKIE[“user”]
// Для удаления cookie нужно установить его срок действия в прошлое
setcookie(“user”, “”, time() - 3600, “/”);
Кука передаётся с сервера в браузер пользователя через HTTP-заголовок Set-Cookie в ответе на запрос.
Каждая кука привязывается к определённому домену. Это означает, что браузер отправит куку только при запросах к указанному домену (или его поддоменам, если это разрешено).
PDO (модуль для работы с базой данных)
PDO (PHP Data Objects) — это абстрактный слой для работы с базами данных в PHP, который предоставляет единый интерфейс для взаимодействия с различными СУБД (системами управления базами данных), такими как MySQL, PostgreSQL, SQLite, MS SQL, и другие. Благодаря PDO, можно использовать одну и ту же кодовую базу для работы с разными базами данных, просто изменив настройки подключения.
- поддержка множества БД
- защита от SQL-инъекций
В Laravel ORM использует PDO для работы с БД на низком уровне
Для чего используется класс \DateTime?
В чем отличие \DateTime от \DateTimeImmutable?
Класс \DateTime в PHP используется для работы с датой и временем. Он позволяет создавать, изменять и форматировать объекты даты и времени, а также выполнять различные манипуляции с ними, такие как добавление или вычитание интервалов времени, сравнение дат, и так далее.
\DateTimeImmutable работает аналогично \DateTime, но с одной ключевой разницей: он неизменяемый. Это значит, что любые изменения даты или времени возвращают новый объект, а сам исходный объект остаётся неизменным.
Отличия:
- DateTime изменяемый объект (меняется исходный объект), DateTimeImmutable неизменяемый (после изменения создаётся новй объект)
- DateTime: может привести к непреднамеренным изменениям, если объект передаётся по ссылке и изменяется в разных частях программы
- DateTimeImmutable может быть менее производительным в некоторых случаях, так как при каждом изменении создаётся новый объект
curl
В PHP для выполнения HTTP-запросов, таких как GET и POST, часто используется расширение cURL. Оно позволяет взаимодействовать с API и обрабатывать ответы.
Отличие отправки POST JSON от POST FORM в заголовке:
- ‘Content-Type: application/json’
- ‘Content-Type: application/x-www-form-urlencoded’
GuzzleHttp в Laravel связан с cURL, поскольку Guzzle использует cURL как один из механизмов для выполнения HTTP-запросов. Однако Guzzle — это более высокоуровневая библиотека, которая предоставляет удобный API для работы с HTTP-запросами и скрывает низкоуровневые детали работы с cURL.
Функции для работы с JSON
json_encode() используется для преобразования PHP-массивов и объектов в строку JSON
json_decode() используется для преобразования строки JSON обратно в массив или объект PHP
json_last_error() возвращает код последней ошибки, возникшей при выполнении функций json_encode() или json_decode()
json_last_error_msg() возвращает текстовое описание последней ошибки, произошедшей при работе с JSON
Флаги json_encode:
- JSON_PRETTY_PRINT Форматирует JSON с отступами и переводами строк для удобства чтения.
- JSON_UNESCAPED_SLASHES Отключает экранирование косых черт (слешей) в строках
- JSON_UNESCAPED_UNICODE Отключает экранирование символов Unicode. Полезно для сохранения символов кириллицы и других алфавитов
- JSON_NUMERIC_CHECK Преобразует строковые значения, содержащие числа, в числа
- JSON_FORCE_OBJECT Преобразует массивы с числовыми ключами в объекты JSON (в обычных условиях они преобразуются в массивы).
Флаги json_decode:
- JSON_BIGINT_AS_STRING Преобразует большие целые числа (которые превышают пределы допустимых чисел PHP) в строки вместо их обрезания
- JSON_OBJECT_AS_ARRAY Преобразует объекты JSON в ассоциативные массивы
Composer
Composer — это инструмент для управления зависимостями в PHP. Он помогает устанавливать, обновлять и контролировать версии библиотек, которые необходимы для проекта
composer.json — это конфигурационный файл, в котором описываются зависимости проекта, скрипты, автозагрузка и другая информация, необходимая для работы с Composer. Этот файл содержит указания, какие библиотеки нужны для проекта и в каких диапазонах версий.
composer.lock — это файл, в котором фиксируются точные версии библиотек, которые были установлены при последнем запуске команды composer install или composer update.
Команда composer require используется для добавления новой зависимости в проект.
Команда composer update обновляет зависимости до последних доступных версий в соответствии с требованиями, указанными в composer.json.
composer install устанавливает зависимости, используя информацию из файла composer.lock
PSR-1: Basic Coding Standart
Стандарт для высокого уровня технической совместимости между общими кодами PHP
- Файлы ДОЛЖНЫ использовать только теги <?phpи <?=
- Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. д.) , либо вызывать побочные эффекты (например, генерировать вывод, изменять настройки .ini и т. д.), но НЕ ДОЛЖНЫ делать и то, и другое.
- Пространства имен и классы ДОЛЖНЫ следовать «автозагрузочному»
- Имена классов ДОЛЖНЫ быть объявлены в StudlyCaps.
- Константы класса ДОЛЖНЫ быть объявлены в верхнем регистре с разделителями-подчеркиваниями.
- Имена методов ДОЛЖНЫ быть объявлены в camelCase.
- PHP-код ДОЛЖЕН использовать только UTF-8 без BOM
- Каждый класс находится в отдельном файле и находится в пространстве имен как минимум одного уровня: имени поставщика верхнего уровня
PSR-4: Autoloader
Этот PSR описывает спецификацию для автозагрузки классов из путей к файлам.
- Полностью определенное имя класса ДОЛЖНО иметь имя пространства имен верхнего уровня, также известное как «пространство имен поставщика»
- Полное имя класса МОЖЕТ иметь одно или несколько имен подпространств имен
- Полностью определенное имя класса ДОЛЖНО иметь конечное имя класса
- Буквенные символы в полном имени класса МОГУТ быть любой комбинацией строчных и заглавных букв.
- Все имена классов ДОЛЖНЫ указываться с учетом регистра.
- Имя конечного класса соответствует имени файла, заканчивающемуся на .php. Имя файла ДОЛЖНО соответствовать регистру имени конечного класса
PSR-12: Extended Coding Style
Цель этой спецификации — уменьшить когнитивное трение при сканировании кода разных авторов
- Закрывающий ?>тег ДОЛЖЕН быть опущен в файлах, содержащих только PHP.
- Каждая инструкция (выражение) должна заканчиваться точкой с запятой и находиться на своей строке
- Объявление пространства имен должно следовать сразу за тегом <?php, за которым может следовать пустая строка.
- Импорт классов через use должен быть отделен одной пустой строкой после объявления пространства имен
- Для отступов используется 4 пробела. Табуляции (tabs) не допускаются
Что такое фреймворк?
Фреймворк — это программная платформа, предоставляющая разработчикам набор готовых инструментов, библиотек, компонентов и стандартов для создания приложений. Это своего рода каркас, который упрощает процесс разработки, предоставляя базовые структуры и возможности, необходимые для разработки программного обеспечения.
Популярные PHP-фреймворки:
- Symfony
- Laravel
- Yii
- Zend / Laminas
Какие задачи решает фреймворк?
- Структурирование кода: Фреймворки предоставляют четкую организацию кода (обычно через MVC — Model-View-Controller), что упрощает поддержку и расширение приложений
- Управление маршрутами: Фреймворки помогают легко настроить маршрутизацию URL к нужным контроллерам.
- Работа с базой данных: С помощью ORM (Object-Relational Mapping) системы, фреймворки упрощают взаимодействие с базами данных, предоставляя абстракции над SQL-запросами.
- Безопасность: Многие фреймворки предоставляют встроенные механизмы защиты от XSS, CSRF, SQL-инъекций и других атак
- Аутентификация и авторизация: Упрощение процессов управления доступом к различным частям приложения через готовые библиотеки и механизмы.
- Масштабируемость: Фреймворки помогают создавать легко масштабируемые приложения за счет своей архитектуры.
Преимущества и недостатки фреймворка перед самописным решение
Преимущества:
- Экономия времени и усилий
- Стандартизация: Фреймворки следуют стандартам разработки, что делает код более читабельным и поддерживаемым другими разработчиками
- Безопасность: Многие фреймворки включают встроенные решения для обеспечения безопасности, что снижает вероятность ошибок и уязвимостей
- Тестирование: Встроенные или легко подключаемые инструменты для тестирования кода
- Масштабируемость и гибкость: Фреймворки предоставляют инструменты для создания гибких и легко масштабируемых приложений
Недостатки:
- Фреймворки могут быть менее производительными, чем самописные решения, так как они содержат много дополнительного кода и функциональности
- Фреймворки устанавливают строгие правила и подходы к написанию кода (архитектуру, паттерны), что ограничивает свободу действий
- При использовании фреймворка проект становится сильно зависимым от его архитектуры и обновлений. Если фреймворк перестает поддерживаться или изменяется кардинальным образом, это может вызвать проблемы с обновлением проекта или переходом на другой фреймворк
- Фреймворки предлагают стандартные способы решения типичных задач, которые могут не подходить для всех проектов. Если требуется нечто необычное или сильно кастомизированное, то настройка фреймворка может оказаться сложной
Что такое MVC?
MVC (Model-View-Controller) — это шаблон проектирования, который разделяет приложение на три взаимосвязанных компонента:
- Модель отвечает за работу с данными и бизнес логикой, взаимодействует с базой данных, хранит правила обработки данных
- Представление отвечает за отображение данных пользователю, не содержит бизнес-логики и только выводит данные, получаемые от контроллера
- Контроллер связывает модель и представление, обрабатывает запросы пользователя, вызывает соответсвующие методы модели, содержит логику маршрутизации
Бизнес-логику следует хранить в Модели (Model). Это связано с тем, что модель отвечает за работу с данными, правилами их обработки и их взаимодействие с другими частями системы.
PHPUnit/Codeception
Общее представление о модульном тестировании
Модульное тестирование (unit testing) — это процесс тестирования отдельных модулей (единиц) программы, чтобы убедиться, что каждый из них работает правильно.
Цель:
- проверка логики
- изоляция (тестирование каждого модуля в изоляции от остальных)
- раннее выявление ошибок
PHPUnit — это один из самых популярных инструментов для модульного тестирования в PHP. Он предоставляет средства для создания тестов, проверки результатов, формирования отчетов и интеграции с CI/CD процессами.
Подходы модульного тестирования и расположение данного вида тестирования в пирамиде
Пирамида состоит из 3-х основных слоёв:
- модульное тестирование (unit): основание пирамиды, проверяют работу небольших модулей в изоляции
- интеграционное тестирвоание: взаимоодействие между различными модулями, проверяет как разные части системы работают вместе
- функциональные и приемочные тесты: тестируют приложение как целую систему, эмулируют действия реальных пользователей
Подходы к модульному тестированию:
- изоляция компонентов (тест проверяет одну функциональность)
- повторяемость и независимость (одинаковые результаты при каждом запуске независимо от порядка выполнения)
- минимизация логики в тестах
- покрытие пограничных случаев
Что такое клиент-серверная архитектура?
Клиент-серверная архитектура — это модель взаимодействия, при которой задачи распределены между двумя основными участниками:
- Клиент: это устройство или программа, которая отправляет запросы серверу для получения данных или выполнения действий.
- Сервер: это программа или устройство, которое обрабатывает запросы клиентов, выполняет действия и возвращает данные или результаты.
Характеристики:
- Разделение обязанностей
- Централизация (сервер централизует логику)
- Множественные клиенты
- Протоколы (HTTP, HTTPS, FTP, SMTP)
Моудльная архитектура
Что такое модуль?
Модульная архитектура — это принцип проектирования, при котором система разделена на отдельные независимые части, называемые модулями. Каждый модуль отвечает за выполнение конкретной функции или задачи и имеет четкие границы. Модули взаимодействуют друг с другом через заранее определенные интерфейсы.
Преимущества:
- Простота поддержки
- Повторное использование кода
- Тестируемость (каждый модуль тестируется отдельно)
- Масштабируемость (легко добавлять новые модули или обновлять существующие, не изменяя всю систему)
Недостатки:
- Сложность разработки интерфейсов между модулями
- Увеличение количества кода
- Перегрузка зависимостями (некоторые модули могут зависить от большого числа других модулей)
- Накладные расходы на коммуникацию
- Дополнительное тестирование взаимодействия между модулями
Модульная архитектура. Что значит протекание логики?
Протекание логики (leaking logic) — это ситуация, когда внутренние детали реализации одного модуля становятся видимыми или зависят от других модулей, что нарушает их изоляцию. Это может происходить, когда модули слишком сильно зависят друг от друга или используют внутренние детали других модулей напрямую, минуя их интерфейсы.
Почему это плохо:
- Нарушение изоляции (данные одного модуля могут изменяться другим, что скажется на работе всей системы)
- Сложность поддержки
- Увеличение связности
- Трудности тестирования
Что такое реляционная БД. Части БД
Реляционная база данных (РБД) — это тип базы данных, в которой данные организованы в виде связанных между собой таблиц. Данные в этих таблицах хранятся в строках и столбцах.
Примеры реляционных баз данных: MySQL, PostgreSQL, Oracle, Microsoft SQL Server.
Таблица (англ. Table) — это структура в реляционной базе данных, которая хранит данные в виде строк и столбцов. Каждая таблица содержит информацию о каком-либо объекте или сущности, например, о пользователях, заказах или продуктах
Поле (англ. Column или Field) — это столбец в таблице, который определяет тип данных, хранящихся в данном столбце.
Запись (англ. Row или Record) — это строка в таблице, представляющая собой набор связанных данных о конкретной сущности
Отношения данных, первичные ключи
Отношения данных — это связи между таблицами в реляционной базе данных. Основные типы отношений:
- Один к одному (1 записи из таблицы_1 соответствует 1 запись из таблицы_2)
- Один ко многим (1 записи из таблицы_1 соответствует несколько записей из таблицы_2)
- Многие ко многим (нескольким записям из таблицы_1 соответсвует несколько записей из таблицы_2. Такие связи реализуются через промежуточные таблицы)
Первичный ключ (Primary Key) — это уникальный идентификатор каждой записи в таблице. Значение первичного ключа должно быть уникальным и не может быть NULL. Этот ключ используется для того, чтобы однозначно идентифицировать каждую строку в таблице.
Целостность данных в БД. Что такое целостность, её виды и возможности обеспечения целостности
Целостность данных — это принцип, обеспечивающий корректность, полноту и надежность данных в базе данных.
Основные типы целостности:
- Целостность сущностей (каждая запись уникально идентифицирована)
- Ссылочная целостность (значение внешнего ключа в одной таблице должно соответсвовать значению первичного ключа в другой таблице или быть NULL)
- Целостность данных на уровне ограничений (уникальность, проверка формата, пустые значения)
Обеспечение целостности в MySQL:
- Ограничения, первичные и внешние ключи, уникальность, проверка формата, разрешение/запрет хранить null значения
- Использование транзакций
- Триггеры — это процедуры, которые автоматически выполняются при определенных событиях (например, при вставке, обновлении или удалении записей)
- Индексы могут быть использованы для повышения производительности запросов и обеспечения быстрого поиска, что может также косвенно помочь поддерживать целостность данных
Нормальные формы БД
Нормализация базы данных — это процесс структурирования данных в реляционных базах данных для минимизации избыточности и обеспечения целостности данных.
- Первая нормальная форма: все столбцы содержат атомарные (неделимые) значения. Каждое поле содержит 1 значение и не может содержать множества значений, все данные в одной колонке могут быть только одного типа, каждая запись в таблице должна однозначно отличаться от других записей
- Вторая нормальная форма: у каждой записи в базе данных должен быть первичный ключ. Нужно удалить избыточные данные из таблицы, которая применяется к нескольким строкам и разместить их в отдельных таблицах
- Третья нормальная форма: необходимо чтобы в таблице отсутствовали неключевые столбцы, которые зависят от других неключевых столбцов.
- Бойс-Коддова нормальная форма (расширенная 3NF): Ключевые атрибуты составного ключа не должны зависеть от неключевых атрибутов.
- Четвёртая нормальная форма: заключается в том, чтобы в таблицах отсутствовали нетривиальные многозначные зависимости
- Пятая нормальная форма
- Шестая нормальная форма
MySQL SELECT UNION
Команда UNION используется для объединения результатов двух или более SQL-запросов в один набор данных. При этом запросы должны иметь одинаковое количество столбцов и совместимые типы данных.
По умолчанию UNION исключает дубликаты из объединенного результата. Если нужно сохранить дубликаты, используется команда UNION ALL.
MySQL
LEFT JOIN
RIGHT JOIN
INNER JOIN
Отличие разных типов join
- INNER JOIN
Назначение:
Соединяет строки двух таблиц, возвращая только те записи, у которых есть совпадение по ключевому полю (условие соединения). Если запись в одной из таблиц не имеет соответствующей записи в другой таблице, она не будет включена в результат - LEFT JOIN (или LEFT OUTER JOIN)
Назначение:
Возвращает все строки из левой таблицы (первой в запросе) и совпадающие строки из правой таблицы. Если для строки из левой таблицы нет соответствующей строки в правой таблице, значения из правой таблицы будут NULL. - RIGHT JOIN (или RIGHT OUTER JOIN)
Назначение:
Возвращает все строки из правой таблицы (второй в запросе) и совпадающие строки из левой таблицы. Если для строки из правой таблицы нет соответствующей строки в левой таблице, значения из левой таблицы будут NULL - CROSS JOIN
возвращает все записи из обеих таблиц
MySQL INSERT. Как обеспечить безопасную вставку записей?
- Использовать подготовленные выражения (например: передавать данные через параметры)
- Использование экранирования данных: Если подготовленные выражения не используются, можно применить функцию mysqli_real_escape_string() для экранирования специальных символов, таких как кавычки.
- Валидация и фильтрация данных: Перед тем как вставлять данные в базу, необходимо проверять их корректность.
- Использование транзакций: Если необходимо выполнить несколько связанных запросов (например, при вставке в несколько таблиц), рекомендуется использовать транзакции
MySQL типы данных. Какие существуют?
Числовые типы:
- INT (TINYINT, SMALLINT, MEDIUMINT, BIGINT) -целые числа
- FLOAT, DOUBLE- числа с плавающей точкой
- DECIMAL - числа с фиксированной точностью
Строковые типы:
- CHAR - строка фиксированной длинны
- VARCHAR - строка переменной длинны
- TEXT (TINYTEXT, MEDIUMTEXT, LONGTEXT) - большие текстовые блоки
Дата и время:
- DATE - дата
- TIME - время
- DATETIME - дата и время
- TIMESTAMP - метка времени
- YEAR - год в виде 4 цифр
Бинарные типы:
- BINARY(n), VARBINARY(n) – бинарные строки фиксированной и переменной длины
- BLOB – большие бинарные объекты (например, файлы, изображения)
Другие типы:
- ENUM – строковый тип данных с фиксированным набором значений.
- SET – множество строковых значений
- JSON
Пространственные типы данных:
- GEOMETRY - Пространственное значение любого типа
- POINT - Точка (пара координат XY)
- LINESTRING - Кривая (одно или несколько POINT-значений)
- POLYGON - Многоугольник
MySQL типы данных. Как влияют на использование памяти?
- Чем больше INT, тем больше паяти нужно для хранения числа (TINYINT - 1b, SMALLINT - 2b, …BIGINT - 8b)
- DOUBLE точнее FLOAT в 2 раза и они занимают 8 байт и 4 байта соответственно. FLOAT и DOUBLE занимают меньше места по сравнению с DECIMAL, но могут допускать погрешности в вычислениях
- DATE, TIME используют 3 байта, DATETIME - 8 байт, а TIMESTAMP - 4
- CHAR всегда занимает фиксированное количество памяти, даже если строка короче, чем максимальная длина. Это может привести к перерасходу памяти
MySQL функции для работы со строками
- Конкатенация (Объединение строк). CONCAT(str1, str2, …): Объединяет две или более строки в одну
- Извлечение подстрок SUBSTRING(str, pos, len): Возвращает подстроку, начиная с позиции pos длиной len
- LEFT(str, len): Возвращает len символов с начала строки
- RIGHT(str, len): Возвращает len символов с конца строки
- INSTR(str, substr): Возвращает позицию первой найденной подстроки в строке, или 0, если подстрока не найдена.
- REPLACE(str, from_str, to_str): Заменяет все вхождения подстроки from_str в строке на to_str
- LOWER(str): Преобразует строку в нижний регистр.
- TRIM([remstr FROM] str): Удаляет пробелы или символы remstr с обоих концов строки
- LPAD(str, len, padstr): Дополняет строку str до длины len, добавляя символы padstr слева
- LENGTH(str): Возвращает длину строки в байтах (не символах)
- CHAR_LENGTH(str): Возвращает количество символов в строке
- STRCMP(str1, str2): Сравнивает две строки. Возвращает 0, если строки равны, -1, если str1 меньше, чем str2, и 1 в противном случае
- REVERSE(str): Возвращает строку в обратном порядке
- HEX(str): Преобразует строку в шестнадцатеричный формат
MySQL функции для работы с числами
- ABS(x): Возвращает абсолютное значение числа x
- MOD(x, y): Возвращает остаток от деления числа x на y
- DIV: Целочисленное деление, возвращает результат деления без остатка
- ROUND(x, d): Округляет число x до d знаков после запятой. Если d не указан, округляет до целого числа
- SIN(x), COS(x), TAN(X)
Redis. Что такое и где применять?
Redis (Remote Dictionary Server) — это высокопроизводительное хранилище данных в оперативной памяти, которое используется как база данных, кэш и брокер сообщений
Применение Redis:
- Кэширование данных: Redis часто используется для кэширования данных, так как хранение данных в оперативной памяти позволяет ускорить доступ к часто используемым данным.
- Сессии и авторизация: Веб-приложения могут использовать Redis для хранения пользовательских сессий.
- Очереди задач: Redis может использоваться для организации очередей задач (например, в фоновом режиме), что упрощает асинхронную обработку задач в приложениях
- Pub/Sub (Публикация/Подписка): Redis может быть использован для реализации систем обмена сообщениями
- Хранилище для временных данных: Redis часто используется для хранения временных данных, таких как одноразовые токены доступа или временные результаты вычислений
MySQL функции для работы с датами и временем
- NOW(): Возвращает текущую дату и время.
- CURDATE(): Возвращает текущую дату (без времени)
- DATE(expr): Извлекает только дату из значения expr
- DATE_FORMAT(date, format): Форматирует дату в соответствии с указанным форматом
- DATE_ADD(date, INTERVAL expr unit): Добавляет к дате определенный интервал времени
- DATE_SUB(date, INTERVAL expr unit): Вычитает из даты определенный интервал времени
- DATEDIFF(date1, date2): Возвращает количество дней между двумя датами
Общие принципы протоколов HTTP и HTTPS
Протоколы HTTP (HyperText Transfer Protocol) и HTTPS (HyperText Transfer Protocol Secure) служат для передачи данных между веб-браузером и веб-сервером. Оба протокола используются для загрузки веб-страниц и передачи информации в интернете, но различаются уровнем безопасности
- Клиент-серверная архитектура: HTTP работает по модели “запрос-ответ”. Клиент (обычно браузер) посылает запрос на сервер, а сервер отвечает нужными данными.
- Протокол без состояния: HTTP не сохраняет информацию о предыдущих запросах. Каждый запрос обрабатывается независимо от других
- Методы запросов GET, POST, PUT, DELETE, PATCH
- Заголовки: HTTP использует заголовки для передачи информации о запросах и ответах, например, тип контента, кодировка, длина сообщения и т.д
В отличие от HTTP, HTTPS:
- HTTPS использует шифрование для защиты данных во время передачи
- Сервер HTTPS использует сертификаты, чтобы удостоверить свою подлинность. Когда браузер получает сертификат, он проверяет его с помощью центра сертификации (CA), чтобы убедиться в подлинности сервера
- Перед началом передачи данных устанавливается защищённое соединение с использованием протоколов SSL/TLS, которое шифрует все данные. Только отправитель и получатель могут дешифровать передаваемую информацию
Централизованная и децентрализованной VCS
Система контроля версий (VCS - Version Control System) — это инструмент, который помогает отслеживать изменения в исходном коде и других файлах проекта с течением времени.
Централизованная система контроля версий предполагает наличие единого центрального сервера, где хранятся все файлы и история изменений. Разработчики получают доступ к этому серверу для работы с кодом.
Децентрализованная система контроля версий предполагает, что каждая копия проекта у каждого разработчика содержит полную историю изменений. В этой модели разработчики могут работать локально и независимо друг от друга, а затем синхронизировать свои изменения с другими.
Принципы REST API
- Клиент-серверная архитектура: Разделение клиента и сервера. Клиент отвечает за пользовательский интерфейс и взаимодействие с пользователем, сервер управляет данными и бизнес-логикой
- Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки. Сервер не сохраняет состояние между запросами
- Ответы сервера должны быть маркированы как кэшируемые или некэшируемые. Это позволяет снизить нагрузку на сервер, если кэшируемые данные могут быть повторно использованы
- REST API следует концепции единообразного интерфейса, что упрощает взаимодействие с сервисом. Включает такие аспекты, как четкое разграничение ресурсов и их представлений
- Каждый ресурс в системе идентифицируется через уникальный URI
SQL Injection. Как проявляется, как защитится
SQL Injection (SQL-инъекция) — это одна из наиболее распространенных и опасных уязвимостей в веб-приложениях, которая возникает, когда пользовательский ввод передается напрямую в SQL-запрос без должной фильтрации или обработки
Как защититься от SQL-инъекций:
- Использование подготовленных выражений
- Использование ORM (Object-Relational Mapping)
- Экранирование данных
- Проверка и фильтрация данных: Необходимо проверять и фильтровать пользовательский ввод, чтобы убедиться, что он соответствует ожидаемому формату
- Минимизация прав доступа к базе данных
- Использование веб-фаерволов
Qitflow
Gitflow — это популярная модель ветвления и управления разработкой, основанная на Git, которая помогает командам организовать процессы работы с кодом в крупных проектах. Она предлагает структурированный подход к созданию и слиянию веток для различных этапов разработки, тестирования и выпуска программного обеспечения.
Главные ветки:
- master (или main): Эта ветка содержит стабильный код
- develop: Ветка, содержащая последний интегрированный код с новыми функциями
Вспомогательные ветки:
- Feature ветки (feature/): Используются для разработки новых функций (feature). Эти ветки создаются от ветки develop и по завершении сливаются обратно в develop
- Release ветки (release/): Создаются, когда команда готовится к выпуску новой версии программного обеспечения
- Hotfix ветки (hotfix/*): Предназначены для срочных исправлений критических ошибок в продакшн-коде
XSS - Межсайтовый скриптинг. Как проявляется, как защитится
XSS (Cross-Site Scripting), или межсайтовый скриптинг, — это уязвимость веб-приложений, позволяющая злоумышленнику внедрять вредоносные скрипты в веб-страницы, которые затем отображаются другим пользователям. Это может привести к кражам сессий, доступу к конфиденциальной информации, а также другим нежелательным действиям на стороне клиента.
Как проявляется:
- Встраивание скриптов в веб-страницы
- Отображение данных, полученных от других пользователей
Защита:
- Экранирование данных
- Использование Content Security Policy (CSP): CSP позволяет ограничить источники, из которых может загружаться контент, включая скрипты
- Проверка и валидация данных
- Избегайте вставки пользовательского ввода в HTML без экранирования
Что значит передача переменных по ссылке и по значению?
Как осуществляется передача объектов?
Когда переменная передается по значению, функция получает копию значения этой переменной. Изменения, сделанные внутри функции, не влияют на оригинальную переменную.
Когда переменная передается по ссылке, функция получает доступ к самой переменной, а не к ее копии. Это означает, что изменения, сделанные внутри функции, повлияют на оригинальную переменную.
В PHP все объекты передаются по ссылке.
Как вызвать функцию через переменную?
Синтаксис стрелочной функции
Что такое анонимная функция?
Чтобы вызвать функцию через переменную, вы можете присвоить имя функции переменной и затем вызвать ее, используя круглые скобки
$functionName = ‘sayHello’;
echo $functionName();
Стрелочные функции (или лямбда-функции) — это сокращенная запись для анонимных функций в PHP, введенная в версии 7.4. Они позволяют определять функции без необходимости использования ключевого слова function. Стрелочные функции также автоматически захватывают переменные из области видимости
$function = fn($arg1, $arg2) => $arg1 + $arg2;
Анонимная функция — это функция, не имеющая имени. Она может быть использована как аргумент для других функций или как значение для переменной. Анонимные функции часто используются для создания колбэков или обработки данных.
Классы. Магические методы
Магические методы — это специальные методы, которые начинаются с двойного подчеркивания (__) и вызываются автоматически при выполнении определенных действий с объектом
__construct()
Вызывается автоматически при создании объекта. Это конструктор, который можно использовать для инициализации свойств объекта
__destruct()
Вызывается автоматически, когда объект уничтожается или скрипт завершает свою работу. Используется для освобождения ресурсов или выполнения завершающих действий
__get($property)
Вызывается при попытке доступа к недоступному или несуществующему свойству объекта
__set($property, $value)
Вызывается при попытке присвоить значение недоступному или несуществующему свойству объекта
__call($name, $arguments)
Вызывается при попытке вызвать несуществующий или недоступный метод объекта
__callStatic($name, $arguments)
Вызывается при попытке вызвать несуществующий или недоступный статический метод класса
__toString()
Вызывается, когда объект пытаются использовать как строку
__invoke()
Вызывается, когда объект пытаются использовать как функцию
__clone()
Вызывается при клонировании объекта, позволяет контролировать процесс копирования
Классы
Ключевое слово final
Клонирование объектов
Сравнение объектов
Ключевое слово final в PHP используется для предотвращения наследования классов или переопределения методов в подклассах. Когда класс или метод объявлен как final, это означает, что он не может быть унаследован или переопределён
В PHP для клонирования объектов используется ключевое слово clone. По умолчанию, при клонировании объекта создаётся копия всех его свойств
Сравнение объектов
Оператор == (сравнение значений):
Этот оператор сравнивает объекты по их свойствам. Два объекта считаются равными, если их свойства совпадают, даже если это разные экземпляры классов
Оператор === (сравнение ссылок на объекты):
Этот оператор проверяет, являются ли два объекта одним и тем же экземпляром (то есть, находятся ли они в одной области памяти)
Ошибки
Какие уровни существуют?
Какие существуют способы установки уровня?
- E_ERROR: Фатальная ошибка, которая приводит к остановке выполнения скрипта.
- E_WARNING: Предупреждение о нефатальной ошибке. Скрипт продолжит выполнение, но может возникнуть неожиданное поведение.
- E_PARSE: Ошибка синтаксиса во время компиляции. Такие ошибки обычно обнаруживаются еще до запуска скрипта.
- E_NOTICE: Сообщение о том, что что-то может быть не так, но это не приводит к остановке выполнения скрипта (например, использование переменной, которая не была инициализирована).
- E_STRICT: Уведомления, которые советуют применять правильные и стандартизированные методы программирования.
- E_DEPRECATED: Сообщение о том, что функция или метод устарели и могут быть удалены в будущих версиях PHP.
- E_USER_ERROR: Фатальная ошибка, созданная пользователем с помощью функции trigger_error().
- E_USER_WARNING: Предупреждение, созданное пользователем.
- E_USER_NOTICE: Сообщение, созданное пользователем
Основные уровни ошибок:
- E_ALL: Включает все типы ошибок
- E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING: Эти типы ошибок возникают во время запуска PHP или во время компиляции
- 0 - отключение всех сообщений об ошибках
Способы установки уровня ошибок
- error_reporting(E_ALL);
- Установка уровня через файл конфигурации php.ini
- ini_set(‘error_reporting’, E_ALL)
- Установка ошибок в Apache или Nginx
Генераторы
Назначение и отличие от обычного перебора коллекции данных
Синтаксис
Когда имеет смысл использовать генератор?
Генераторы в PHP — это специальная функция, которая позволяет создавать итераторы (объекты, которые можно перебирать), не загружая всю коллекцию данных в память сразу. Вместо этого они «лениво» генерируют значения по мере необходимости, что делает их очень эффективными для работы с большими объемами данных
Назначение и отличия: Эффективное использование памяти (при переборе коллекции все данные загружаются сразу же, генератор же может может возвращать данные по одному элементу за раз)
Имеет смысл использовать:
- работа с большими данными
- ленивые вычисления
Как записать прочитать/записать файл построчно?
Как записать прочитать/записать файл целиком?
Для построчного чтения файла в PHP можно использовать функцию fgets(), которая считывает файл по одной строке
Для записи файла построчно можно использовать функцию fwrite(), которая записывает данные в открытый файл
Для чтения всего файла целиком можно использовать функцию file_get_contents(), которая считывает содержимое файла в виде строки
Для записи данных в файл целиком можно использовать функцию file_put_contents()
Паттерны проектирования. Паттерн стратегия
Паттерны проектирования — это повторяемые решения общих задач, с которыми сталкиваются разработчики программного обеспечения при проектировании архитектуры. Это не готовый код, а скорее рекомендации, шаблоны для решения определенных задач. Паттерны помогают сделать код более структурированным, гибким и поддерживаемым.
Паттерн “Стратегия” — это поведенческий паттерн, который позволяет определить семейство схожих алгоритмов (или стратегий) и вынести их в отдельные классы. Это позволяет изменять алгоритм во время выполнения программы.
Когда использовать:
- Когда нужно выполнять разные действия в зависимости от состояния объекта.
- Когда имеется несколько схожих алгоритмов, которые можно переключать во время выполнения программы.
- Когда нужно избежать большого количества условных операторов (например, if-else или switch).
Примеры:
- интерфейс TaxStrategy с функцией расчёта нлога. Классы EuropeTax, RussiaTax, USATax и класс TaxCalculator, который принимает в конструкторе TaxStrategy
- Выбор способа сортировки
Паттерны проектирования. Паттерн фабрика
Паттерн “Фабрика” — это порождающий паттерн, который определяет интерфейс для создания объектов, но позволяет подклассам решать, какой именно объект создавать. Основная идея — делегировать создание объектов отдельному классу или методу
Когда использовать:
Когда точный тип создаваемого объекта заранее неизвестен и зависит от условий.
Когда нужно централизовать логику создания объектов.
Когда нужно уменьшить зависимость кода от конкретных классов, используя абстракции
Примеры:
- Создание автомобилей. Интерфейс Car, классы Sedan, Audi. Класс CarFactory, принимающий на входе тип и возвращающий соответствующий класс машины
- Создание подключения к базе данных
- Создание уведомлений
KISS (Keep It Simple, Stupid / Будь проще)
Принцип KISS (Keep It Simple, Stupid) — это один из фундаментальных принципов программирования и проектирования систем, который рекомендует делать вещи как можно проще, без ненужных усложнений. Основная идея этого принципа заключается в том, что проще писать и поддерживать код, когда он не перегружен сложными конструкциями и излишней логикой.
Аспекты:
- Простота (код должен быть простым и понятным)
- Минимизация (не следует добавлять код, который не требуется для выполнения поставленной задачи)
- Читаемость
- Удобство сопровождения
Примеры соблюдения KISS:
- Разделение больших функций на несколько маленьких и специализированных.
- Использование простых циклов и условий, вместо сложных или вложенных конструкций.
- Избегание чрезмерного количества абстракций, если они не добавляют реальной пользы