PHP | Вопросы собесов
2.44K subscribers
31 photos
1.04K links
Download Telegram
🤔 Слово "global" для чего используется?

Слово global позволяет получить доступ к переменной, определённой за пределами текущей функции. Используется, чтобы модифицировать глобальные переменные внутри функций.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 По какому принципу бы старались разделять модули, если находились бы не на уровне классов, а выше?

Если говорить о разделении модулей на более высоком уровне, чем классы, то мы ориентируемся на архитектурные принципы. Основной подход — разделение ответственности (Separation of Concerns, SoC).

🚩Основные принципы разделения модулей

🟠SRP (Single Responsibility Principle, Принцип единственной ответственности)
- Каждый модуль решает только одну задачу.
- Например, отдельно: модуль аутентификации, модуль работы с БД, модуль обработки заказов.

🟠MVC (Model-View-Controller)
- Разделение приложения на модель (логика данных), представление (интерфейс), контроллер (управление логикой).
- Например, в Laravel:
- Models/ — работа с данными
- Views/ — шаблоны
- Controllers/ — обработка запросов

🟠Чистая архитектура (Clean Architecture, Hexagonal, Onion)
- Модули делятся на уровни, где:
- Центральная часть — доменная логика (независимая от фреймворка).
- Внешние слои — адаптеры, API, базы данных.
- Код становится гибким и легко тестируемым.

🟠DDD (Domain-Driven Design, Предметно-ориентированное проектирование)
- Разделение по бизнес-контексту (Bounded Contexts).
- Например, в интернет-магазине:
- Модуль заказов (Orders)
- Модуль оплаты (Payments)
- Модуль пользователей (Users)

🟠Микросервисная архитектура
- Разделение системы на отдельные сервисы, которые общаются через API.
- Например:
- auth-service (регистрация, вход)
- order-service (работа с заказами)
- payment-service (оплата)
- Удобно при высокой нагрузке и масштабировании.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое рекурсия?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем разница между вертикальным и горизонтальным масштабированием?

Масштабирование (scaling) — это процесс увеличения мощности системы, чтобы она справлялась с увеличенной нагрузкой. В программировании и серверной архитектуре есть два типа масштабирования:
Вертикальное масштабирование (Vertical Scaling, Scale-Up)
Горизонтальное масштабирование (Horizontal Scaling, Scale-Out)

🚩Вертикальное масштабирование (Vertical Scaling)

- Улучшение одного сервера: больше оперативной памяти (RAM), мощнее процессор (CPU), быстрее диск (SSD/NVMe).
- Приложение остаётся на одном сервере, просто он становится мощнее.

🚩Горизонтальное масштабирование (Horizontal Scaling)

- Добавляются новые серверы, работающие параллельно.
- Нагрузка распределяется между несколькими машинами.
- Используются балансировщики нагрузки (Nginx, HAProxy, AWS ELB).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Идущий к IT
🔥 Записал видос "Как за 3 минуты настроить Автоотклики на вакансии HeadHunter" больше не придется заниматься этой унылой рутиной

📺 Видео: https://youtu.be/G_FOwEGPwlw
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое интерфейсы?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какие протоколы ты знаешь?

Протоколы в сетевых системах обеспечивают правила передачи данных. Они работают на разных уровнях модели OSI и TCP/IP. Вот основные виды протоколов:

🚩Основные виды протоколов

🟠Физический и канальный уровни
Ethernet: Передача данных по проводным сетям.
Wi-Fi (IEEE 802.11): Беспроводная передача данных.
PPP (Point-to-Point Protocol): Соединение между двумя узлами.
HDLC (High-Level Data Link Control): Передача данных на канальном уровне.

🟠Сетевой уровень
IP (Internet Protocol): Основной протокол для передачи данных в интернете (IPv4 и IPv6).
ICMP (Internet Control Message Protocol): Передача сообщений об ошибках и контроля.

🟠Транспортный уровень
TCP (Transmission Control Protocol): Надежная передача данных.
UDP (User Datagram Protocol): Быстрая, но ненадежная передача данных.

🟠Сеансовый и представительный уровни
SSL/TLS (Secure Sockets Layer / Transport Layer Security): Обеспечение безопасности передачи данных.
NetBIOS: Работа сетевых приложений в локальных сетях.

🟠Прикладной уровень
HTTP/HTTPS (HyperText Transfer Protocol / Secure): Передача веб-страниц.
FTP (File Transfer Protocol): Передача файлов.
SMTP (Simple Mail Transfer Protocol): Передача электронной почты.
POP3/IMAP: Получение электронной почты.
DNS (Domain Name System): Преобразование доменных имен в IP-адреса.
SSH (Secure Shell): Безопасное удаленное управление серверами.
SNMP (Simple Network Management Protocol): Управление сетевыми устройствами.
LDAP (Lightweight Directory Access Protocol): Доступ и управление каталогами.
DHCP (Dynamic Host Configuration Protocol): Динамическое назначение IP-адресов.

🟠Специализированные протоколы
VoIP (Voice over IP): Передача голосовых данных (SIP, RTP).
MQTT (Message Queuing Telemetry Transport): Обмен сообщениями в IoT.
CoAP (Constrained Application Protocol): Работа с ограниченными устройствами в IoT.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое чистая архитектура?

Это принцип построения ПО, который отделяет бизнес-логику от деталей реализации.
Ключевые принципы:
- Разделение слоев – отделение логики от UI и базы данных.
- Независимость от фреймворков – можно менять базу данных или API без переписывания логики.
- Устойчивость к изменениям – легче поддерживать и тестировать код.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какое отличие у протоколов tcp и udp?

Это два основных транспортных протокола в интернете. Они имеют разные характеристики и используются для различных целей.

🚩Основные отличия

🟠Надежность
TCP: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (ACK), контроль потерь пакетов, повторную передачу потерянных пакетов и контроль потока. Это гарантирует, что данные будут доставлены корректно и в правильном порядке.
UDP: Не обеспечивает надежную передачу данных. Нет подтверждений получения, нет повторной передачи потерянных пакетов и нет контроля потока. Это делает передачу менее надежной, но более быстрой и с меньшими накладными расходами.

🟠Установление соединения
TCP: Перед началом передачи данных устанавливается соединение с помощью процедуры "трехстороннего рукопожатия" (three-way handshake). Это означает, что обе стороны сначала обмениваются сигналами SYN и ACK для установления соединения.
UDP: Не требует установления соединения. Пакеты (датаграммы) просто отправляются к получателю без предварительного установления соединения.

🟠Порядок доставки
TCP: Обеспечивает доставку данных в правильном порядке. Если пакеты приходят в неправильном порядке, TCP собирает их в правильном порядке перед передачей приложению.
UDP: Не гарантирует порядок доставки. Пакеты могут приходить в произвольном порядке, и приложение должно обрабатывать их соответствующим образом, если это необходимо.

🟠Пропускная способность и задержки
TCP: Из-за механизмов контроля потока и подтверждений имеет большие накладные расходы и, следовательно, может быть медленнее. Это особенно заметно на сетях с высокой задержкой или потерей пакетов.
UDP: Из-за отсутствия контроля потока и подтверждений имеет меньшие накладные расходы, что может привести к меньшим задержкам и большей пропускной способности. Подходит для приложений, где важна скорость, а не надежность.

🟠Применение
TCP: Используется для приложений, где важна надежность и порядок передачи данных, таких как веб-браузеры (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3), файловые передачи (FTP), удаленный доступ (SSH).
UDP: Используется для приложений, где важна скорость и где потеря некоторых пакетов не критична, таких как потоковое видео и аудио (VoIP, IPTV), онлайн-игры, службы доменных имен (DNS).

🚩Примеры использования

TCP
HTTP/HTTPS: Веб-серфинг
SMTP: Отправка электронной почты
IMAP/POP3: Получение электронной почты
FTP: Передача файлов
SSH: Безопасный удаленный доступ


UDP
DNS: Запросы доменных имен
VoIP: Передача голоса через IP
IPTV: Потоковое видео
Онлайн-игры: Быстрая передача данных игровой логики
NTP: Синхронизация времени


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Как расшифровывается REST?

REST (Representational State Transfer) — это архитектурный стиль взаимодействия систем через HTTP. Он основан на представлении ресурсов как URL и использовании стандартных HTTP-методов (GET, POST, PUT, DELETE) для работы с этими ресурсами.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🤔 В чем отличие адаптера от декоратора?

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

🚩Адаптер (Adapter)

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

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

🚩Декоратор (Decorator)

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

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

🚩Отличия

🟠Цель применения
Адаптер используется для обеспечения совместимости между различными интерфейсами, позволяя объектам с несовместимыми интерфейсами работать вместе. Декоратор добавляет новую функциональность объектам, не изменяя их интерфейсы.

🟠Изменение интерфейса
Адаптер изменяет интерфейс объекта для совместимости с другим интерфейсом. Декоратор не изменяет интерфейс, но добавляет новое поведение, сохраняя при этом оригинальный интерфейс объекта.

🟠Добавление функциональности
Декораторы предназначены для добавления новой функциональности объектам. Адаптеры не добавляют новую функциональность; их основная задача — обеспечить работу существующей функциональности через другой интерфейс.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Как посчитать функцию, если внутри неё много различных действий?

Алгоритм анализируется путём определения сложности каждого действия и их комбинирования. Итоговая сложность определяется доминирующим элементом.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👍1💊1
🤔 Зачем нужен шаблон Builder?

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

🚩Зачем нужен Builder?

🟠Упрощает создание сложных объектов
Когда объект имеет много параметров, особенно опциональных (например, дом с разными опциями — бассейном, гаражом, садом).

🟠Избегает перегруженных конструкторов
Вместо того чтобы передавать кучу аргументов в конструктор (new Car("red", 4, true, "diesel")), мы можем строить объект постепенно.

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

🚩Пример использования в PHP

Допустим, мы строим объект Car (Машина).
Проблема без Builder'а (длинный конструктор)
class Car {
public string $color;
public int $wheels;
public bool $sunroof;
public string $engine;

public function __construct(string $color, int $wheels, bool $sunroof, string $engine) {
$this->color = $color;
$this->wheels = $wheels;
$this->sunroof = $sunroof;
$this->engine = $engine;
}
}

$car = new Car("red", 4, true, "diesel"); // Что значат true и 4? Непонятно.


Решение с использованием Builder
class Car {
public string $color;
public int $wheels;
public bool $sunroof;
public string $engine;

private function __construct() {} // Закрываем прямой доступ к конструктору

public static function builder(): CarBuilder {
return new CarBuilder();
}
}

class CarBuilder {
private Car $car;

public function __construct() {
$this->car = new Car();
}

public function setColor(string $color): self {
$this->car->color = $color;
return $this;
}

public function setWheels(int $wheels): self {
$this->car->wheels = $wheels;
return $this;
}

public function setSunroof(bool $sunroof): self {
$this->car->sunroof = $sunroof;
return $this;
}

public function setEngine(string $engine): self {
$this->car->engine = $engine;
return $this;
}

public function build(): Car {
return $this->car;
}
}

// Использование
$car = Car::builder()
->setColor("red")
->setWheels(4)
->setSunroof(true)
->setEngine("diesel")
->build();

var_dump($car);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3
🤔 Что такое инкремент и декремент?

Инкремент (`++`) и декремент (`--`) — это операции в PHP и других языках программирования, которые увеличивают или уменьшают значение переменной на единицу соответственно.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Расскажи о Unit tests

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

🚩Зачем нужны Unit-тесты?

🟠Раннее выявление ошибок
тесты помогают обнаружить баги сразу после написания кода.
🟠Упрощение рефакторинга
при изменении кода можно быстро проверить, не сломалось ли что-то.
🟠Уверенность в качестве кода
тесты показывают, что функции работают так, как задумано.
🟠Автоматизация тестирования
можно запускать тесты автоматически перед каждым релизом.
🟠Документирование кода
тесты помогают понять, как должна работать функция.

🚩Как писать Unit-тесты в PHP?

В PHP для написания тестов чаще всего используют PHPUnit – это популярный фреймворк для модульного тестирования.
Устанавливаем через Composer:
composer require --dev phpunit/phpunit


🚩Пример Unit-теста

Допустим, у нас есть функция в классе Calculator, которая складывает два числа
class Calculator {
public function add($a, $b) {
return $a + $b;
}
}


Теперь создадим тест для проверки работы метода add
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase {
public function testAdd() {
$calc = new Calculator();
$result = $calc->add(2, 3);
$this->assertEquals(5, $result);
}
}


🚩Запуск тестов

Чтобы запустить тест, используем команду
vendor/bin/phpunit tests


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какая разница между self и this?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какие виды уязвимости знаешь?

В веб-разработке существует множество уязвимостей, но самые распространенные
SQL-инъекции (SQL Injection)
Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Ошибки аутентификации и управления сессиями
Необработанные пользовательские данные
Доступ к файлам и директориям (LFI/RFI – Local/Remote File Inclusion)
Ошибки конфигурации сервера и утечки данных

🟠SQL-инъекции (SQL Injection)
Атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, получая доступ к БД.
Чтение / изменение данных
Удаление таблиц
Получение паролей пользователей
Используем подготовленные запросы (Prepared Statements)
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();


🟠Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу.
Кража cookies и сеансов
Изменение содержимого страницы
Фишинг
Очистка данных перед выводом
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');


🟠Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Злоумышленник заставляет пользователя выполнить нежелательный запрос от его имени (например, перевести деньги).
Изменение данных без ведома пользователя
Подмена учетных записей
Используем CSRF-токены
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));


При отправке формы проверяем
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF атака!");
}


🟠Ошибки аутентификации и управления сессиями
Если пароли хранятся неправильно или сессии уязвимы, злоумышленник может перехватить учетную запись пользователя.
Кража пароля
Перехват сессии
Храним пароли с password_hash(), а не в открытом виде:
$hash = password_hash("mypassword", PASSWORD_BCRYPT);


🟠Необработанные пользовательские данные
Приложение принимает и использует входные данные без проверки.
Возможность загрузки вредоносных файлов
Выполнение вредоносного кода
Проверяем загружаемые файлы (MIME-тип, расширение)
Используем валидацию данных:
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);


🟠Доступ к файлам и директориям (LFI/RFI)
Злоумышленник может загружать и выполнять опасные файлы через параметры в URL.
Выполнение кода на сервере
Чтение конфиденциальных файлов
Запрещаем прямую загрузку файлов:
$whitelist = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $whitelist)) {
die("Недопустимый файл!");
}


🟠Ошибки конфигурации сервера и утечки данных
Если сервер настроен неправильно, можно случайно раскрыть важные данные.
Вывод ошибок PHP в браузере
Доступ к файлам .env, config.php
Отключаем display_errors в php.ini:
display_errors = Off


Защищаем файлы .env через .htaccess

  <Files .env>
Order allow,deny
Deny from all
</Files>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что содержит инкапсуляция кроме сокрытия данных?

1. Контроль доступа: использование модификаторов public, protected, private для ограничения доступа.
2. Инкапсуляция логики: методы класса предоставляют контролируемый интерфейс для работы с данными.
3. Сохранение целостности: защита данных от некорректных изменений извне.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чём суть абстрактного класса?

Абстрактный класс и в ООП в целом — это специальный тип класса, который не может быть инстанциирован напрямую. Это означает, что вы не можете создать объект абстрактного класса используя оператор new напрямую. Суть его заключается в том, чтобы служить основой для других классов, от которых будут создаваться объекты.

abstract class ТранспортноеCредство {
protected $скорость;

public function установитьСкорость($скорость) {
$this->скорость = $скорость;
}

abstract public function двигаться();
}

class Автомобиль extends ТранспортноеCредство {
public function двигаться() {
echo "Движется на скорости: " . $this->скорость . " км/ч";
}
}

// $транспорт = new ТранспортноеCредство(); // Ошибка: не может быть инстанциирован
$автомобиль = new Автомобиль();
$автомобиль->установитьСкорость(60);
$автомобиль->двигаться();


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 По какому принципу объединяются и разделяются методы в интерфейсах?

Методы в интерфейсах группируются по роли или контракту, то есть:
- Каждый интерфейс должен описывать конкретное поведение (например, Serializable, Renderable).
- Принцип разделения интерфейса (Interface Segregation Principle, SOLID) — лучше несколько небольших интерфейсов, чем один громоздкий.
- Интерфейс отражает намерение: что объект умеет делать, а не как он это делает.
Это упрощает поддержку, повторное использование и тестирование кода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1