Собеседование 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 в ассоциативные массивы
" . parent::operation() . "
"; } } class EncryptDecorator extends TextDecorator { public function operation(): string { return base64_encode(parent::operation()); } } ``` Вызываем цепочку декораторов ``` $text = new SimpleText("Hello, World!"); $decoratedText = new EncryptDecorator(new HtmlDecorator($text)); $decoratedText->operation(); ```' . $body . '
'); $this->mailer->send($email); } } ```