PHP | Вопросы собесов
前往频道在 Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
显示更多2 325
订阅者
无数据24 小时
-17 天
-930 天
帖子存档
🤔 Зачем нужны паттерны проектирования?
Это повторяемые решения типичных задач. Они помогают разработчикам создавать программы, которые легко поддерживать, расширять и модифицировать. Паттерны проектирования упрощают процесс разработки, обеспечивая проверенные способы решения распространенных проблем, что экономит время и силы разработчиков.
🚩Зачем они нужны
🟠Повторяемость и стандартность
Паттерны обеспечивают повторяемость решений для часто возникающих задач, что снижает вероятность ошибок и улучшает читабельность кода.
🟠Улучшение коммуникации
Использование общепринятых паттернов облегчает коммуникацию между разработчиками. Когда все понимают, что подразумевается под, например, «одиночкой» (singleton), это упрощает обсуждение архитектуры системы.
🟠Повышение качества кода
Паттерны проектирования способствуют созданию более структурированного, гибкого и поддерживаемого кода.
🟠Экономия времени и ресурсов
Паттерны позволяют не изобретать велосипед, а использовать проверенные решения, что ускоряет процесс разработки.
🚩Как они используются
Паттерны проектирования делятся на несколько категорий, каждая из которых решает определенный тип задач:
🟠Порождающие паттерны
Эти паттерны касаются создания объектов. Примеры: Singleton, Factory, Builder.
🟠Структурные паттерны
Эти паттерны касаются построения структуры больших объектов. Примеры: Adapter, Composite, Decorator.
🟠Поведенческие паттерны
Эти паттерны касаются взаимодействия и распределения обязанностей между объектами. Примеры: Observer, Strategy, Command.
class Singleton {
private static $instance;
private function __construct() {
// Закрытый конструктор предотвращает создание объекта через new
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function someBusinessLogic() {
// Некоторая бизнес-логика
}
}
// Использование Singleton
$singleton = Singleton::getInstance();
$singleton->someBusinessLogic();
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое Entity?
Это объект, представляющий конкретную сущность в системе или домене. Обычно он имеет уникальный идентификатор и может изменяться в течение своего жизненного цикла.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем заключается обработка ошибок и исключений?
Обработка ошибок в PHP – это механизм, который помогает находить, интерпретировать и корректно реагировать на ошибки во время выполнения программы. Для этого в PHP используются два подхода:
Традиционные ошибки (
error_reporting, set_error_handler)
*Исключения (try-catch, throw)
🟠Традиционная обработка ошибок
PHP изначально использовал механизм ошибок, которые делятся на несколько типов:
E_ERROR – фатальная ошибка, завершает выполнение скрипта.
E_WARNING – предупреждение, но скрипт продолжает выполняться.
E_NOTICE – уведомление о потенциальной проблеме.
echo $undefined_var; // E_NOTICE: Undefined variable
🚩Способы обработки ошибок
🟠error_reporting() – управление уровнем ошибок
Функция error_reporting() позволяет включать или выключать определённые типы ошибок.
error_reporting(E_ALL & ~E_NOTICE); // Показывать все ошибки, кроме E_NOTICE
🟠set_error_handler() – создание пользовательского обработчика ошибок
Можно задать свою функцию, которая будет реагировать на ошибки.
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "Ошибка [$errno]: $errstr в файле $errfile на строке $errline";
}
set_error_handler("myErrorHandler");
// Вызовем ошибку
echo 10 / 0; // Division by zero (E_WARNING)
🟠error_log() – запись ошибок в файл
Ошибки можно не выводить на экран, а записывать в файл.
error_log("Ошибка: что-то пошло не так!", 3, "errors.log");
🚩Исключения (`try-catch`)
С версии PHP 5 появился механизм исключений, который более удобен и структурирован. Исключения позволяют:
Перехватывать ошибки и управлять их обработкой.
Использовать вложенные блоки try-catch для детальной обработки.
Создавать собственные классы исключений.
try {
if (!file_exists("somefile.txt")) {
throw new Exception("Файл не найден");
}
} catch (Exception $e) {
echo "Ошибка: " . $e->getMessage();
}
🟠Классы исключений
PHP позволяет использовать предопределённый класс Exception, а также создавать свои.
class MyException extends Exception {}
try {
throw new MyException("Это моя ошибка");
} catch (MyException $e) {
echo "Поймано исключение: " . $e->getMessage();
}
🟠Блок `finally`
Используется для выполнения кода в любом случае – независимо от того, было исключение или нет.
try {
echo "Попытка выполнить код\n";
} catch (Exception $e) {
echo "Ошибка поймана\n";
} finally {
echo "Этот код выполнится в любом случае\n";
}
Ставь 👍 и забирай 📚 Базу знанийКвартиры Петербург Новостройка Рассрочка от застройщика
Жилой комплекс "Квартал Заречье"
Санкт-Петербург. Колпино.
4 девятиэтажных жилых корпуса
8-этажный крытый гараж на 496 парковочных мест
В живописном месте у реки Ижора.
На первых этажах будут размещены магазины, кофейни, поликлиника и зона коворкинга.
Перейти на сайт
Финансовые услуги оказывает: ПАО «Сбербанк». Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО «СЗ «ЗАГОРОДНАЯ, 71».
#реклама
квартал-заречье.рф
О рекламодателе
🤔 Что такое поведение copy-on-write?
Это механизм оптимизации памяти, при котором копия объекта создаётся только в случае изменения исходного объекта. До изменений объекты разделяют один и тот же адрес в памяти.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое сервис локатор?
Это паттерн проектирования, который используется для абстрагирования процесса поиска и предоставления зависимостей объектам. Вместо того чтобы объекты сами создавали свои зависимости или получали их через конструкторы, они запрашивают их у специального объекта – локатора сервисов.
🚩Зачем нужен
🟠Упрощение управления зависимостями
Все зависимости находятся в одном месте, что упрощает их управление и замену.
🟠Гибкость
Легко менять конкретные реализации зависимостей без изменения клиентского кода.
🟠Централизация
Все зависимости зарегистрированы и управляются в одном месте.
🟠Улучшение тестирования
Легко подменять зависимости на моки для проведения тестов.
🚩Как используется
Паттерн Service Locator может быть реализован через создание централизованного реестра, который хранит информацию о различных сервисах и предоставляет их по запросу.
1⃣Создание интерфейсов сервисов
interface Logger {
public function log($message);
}
interface PaymentProcessor {
public function processPayment($amount);
}
2⃣Реализация сервисов
class FileLogger implements Logger {
public function log($message) {
echo "Logging message to a file: $message";
}
}
class StripePaymentProcessor implements PaymentProcessor {
public function processPayment($amount) {
echo "Processing payment of $amount through Stripe";
}
}
3⃣Реализация Service Locator
class ServiceLocator {
private $services = [];
public function register($serviceName, $service) {
$this->services[$serviceName] = $service;
}
public function get($serviceName) {
if (!isset($this->services[$serviceName])) {
throw new Exception("Service not found: " . $serviceName);
}
return $this->services[$serviceName];
}
}
4⃣Регистрация и использование сервисов
$serviceLocator = new ServiceLocator();
// Регистрация сервисов
$serviceLocator->register('logger', new FileLogger());
$serviceLocator->register('paymentProcessor', new StripePaymentProcessor());
// Использование сервисов
$logger = $serviceLocator->get('logger');
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.
$paymentProcessor = $serviceLocator->get('paymentProcessor');
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe
🚩Плюсы и минусы
➕Централизация
Все зависимости хранятся и управляются в одном месте.
➕Гибкость
Легко изменять зависимости без изменения кода, который их использует.
➕Удобство тестирования
Легко подменять реальные зависимости на моки для тестирования.
➖Скрытые зависимости
Зависимости не видны явно в коде, что может усложнить понимание.
➖Сложность
Может привести к более сложной архитектуре, особенно в больших приложениях.
Ставь 👍 и забирай 📚 Базу знаний🤔 Для чего нужна рефлексия?
Рефлексия (Reflection) – это механизм анализа классов, методов, свойств и других структур во время выполнения. Она позволяет получать информацию о коде и даже изменять его динамически.
🚩Когда полезна рефлексия?
🟠Фреймворки и DI-контейнеры
- Используется для автоматического внедрения зависимостей (Dependency Injection, DI).
- Например, Laravel использует рефлексию в
Container для автоматического создания объектов.
class Database {
public function connect() {
return "Подключение к базе данных";
}
}
class UserService {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function getUser() {
return "Пользователь найден";
}
}
function resolve($class) {
$reflector = new ReflectionClass($class);
$constructor = $reflector->getConstructor();
if (!$constructor) {
return new $class;
}
$params = $constructor->getParameters();
$dependencies = [];
foreach ($params as $param) {
$type = $param->getType();
if ($type) {
$dependencies[] = resolve($type->getName());
}
}
return $reflector->newInstanceArgs($dependencies);
}
$service = resolve(UserService::class);
echo $service->getUser(); // "Пользователь найден"
🟠Декораторы, аннотации и атрибуты
- В PHP 8 появились атрибуты (аннотации), и рефлексия помогает их читать.
- Используется в Symfony, Doctrine для работы с ORM.
#[Attribute]
class Route {
public function __construct(public string $path) {}
}
class Controller {
#[Route('/home')]
public function home() {
return "Домашняя страница";
}
}
$reflection = new ReflectionMethod(Controller::class, 'home');
$attributes = $reflection->getAttributes(Route::class);
$route = $attributes[0]->newInstance();
echo $route->path; // "/home"
🟠Автоматическая генерация документации
- Реально использовать для автоматического создания Swagger/OpenAPI.
- Можно извлекать PHPDoc-комментарии и на их основе генерировать документацию.
class Example {
/**
* Возвращает приветствие
* @return string
*/
public function sayHello() {
return "Привет!";
}
}
$reflection = new ReflectionMethod(Example::class, 'sayHello');
echo $reflection->getDocComment();
Ставь 👍 и забирай 📚 Базу знанийИз разработчика в тимлиды: как говорить с людьми
Стать тимлидом — значит научиться говорить с людьми о сложном. Но как сказать разработчику, что код — "не очень", не обидев?
📅 16 сентября в 20:00 Александр Пряхин разберет техники обратной связи без эскалации. Узнаете, как формулировать по фактам, снижать защитную реакцию и завершать разговор договоренностями. Для разработчиков, готовящихся к лидерству.
Узнать больше
#реклама 16+
otus.ru
О рекламодателе
🤔 В чем преимущества асинхронного шифрования?
1. Безопасность: открытый ключ можно свободно распространять, закрытый ключ остаётся приватным.
2. Удобство обмена: не требуется передавать секретный ключ для шифрования.
3. Поддержка цифровой подписи: позволяет проверять подлинность отправителя.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Для чего используется индексация и что это такое?
Индексация — это механизм в базах данных, который ускоряет поиск данных в таблицах. Индекс работает как оглавление книги: вместо того чтобы просматривать всю таблицу, база находит нужные данные по индексу.
🚩Зачем нужна индексация?
Ускоряет поиск (
SELECT) – база данных быстрее находит нужные строки.
Ускоряет сортировку (ORDER BY) – индексы помогают быстрее упорядочивать данные.
Оптимизирует соединения таблиц (JOIN).
Замедляют операции INSERT, UPDATE, DELETE (так как индекс тоже нужно обновлять).
Индексы занимают дополнительное место в памяти.
🚩Пример индекса в SQL
1⃣Создание индекса
CREATE INDEX idx_users_name ON users(name);
Теперь поиск по name будет быстрее
SELECT * FROM users WHERE name = 'Alice';
🚩Типы индексов
🟠Обычный (B-Tree) индекс
Основной вид индекса, который ускоряет поиск по WHERE.
CREATE INDEX idx_name ON users(name);
🟠UNIQUE-индекс
Гарантирует, что значения в колонке не будут повторяться.
CREATE UNIQUE INDEX idx_email ON users(email);
🟠FULLTEXT-индекс
Используется для быстрого поиска по тексту.
CREATE FULLTEXT INDEX idx_text ON articles(content);
🟠Composite (Составной) индекс
Индекс сразу на несколько колонок (например, name + age).
CREATE INDEX idx_name_age ON users(name, age);
Ставь 👍 и забирай 📚 Базу знанийРозыгрыш Яндекс Станции уже в боте
Любимые блогеры, розыгрыши, новости и анонсы в одном боте!
Узнать больше
#реклама 16+
refer.id
О рекламодателе
🤔 Что содержит инкапсуляция кроме сокрытия данных?
Инкапсуляция — это не только скрытие данных, но и ограничение доступа к внутренним деталям объекта + защита логики от внешнего вмешательства.
🚩Основные аспекты инкапсуляции
Сокрытие данных (
private, protected).
Контроль доступа через геттеры и сеттеры.
Защита объекта от некорректных данных.
Чёткое API для работы с объектом.
Разделение ответственности внутри класса.
🟠Сокрытие данных (`private`, `protected`)
Скрываем внутренние переменные, чтобы их нельзя было изменить напрямую.
class User {
private string $password; // Прямой доступ запрещён
public function __construct(string $password) {
$this->password = $password;
}
}
$user = new User("123456");
// echo $user->password; // ❌ Ошибка! Доступ запрещён
🟠Контроль доступа через геттеры и сеттеры
Предоставляем доступ к данным через методы (контролируем поведение).
class User {
private string $password;
public function __construct(string $password) {
$this->setPassword($password);
}
public function getPassword(): string {
return "Секретный пароль скрыт"; // Никогда не выдаём оригинал
}
public function setPassword(string $password) {
if (strlen($password) < 6) {
throw new Exception("Пароль слишком короткий!");
}
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
}
$user = new User("securePass");
// echo $user->password; // ❌ Ошибка! Доступ запрещён
echo $user->getPassword(); // ✅ "Секретный пароль скрыт"
🟠Защита объекта от некорректных данных
Инкапсуляция позволяет проверять данные перед их сохранением.
class Product {
private float $price;
public function setPrice(float $price) {
if ($price < 0) {
throw new Exception("Цена не может быть отрицательной!");
}
$this->price = $price;
}
}
🟠Чёткое API для работы с объектом
Инкапсуляция создаёт удобный интерфейс для работы с классом.
class Order {
private array $items = [];
public function addItem(string $item) {
$this->items[] = $item;
}
public function getItems(): array {
return $this->items;
}
}
$order = new Order();
$order->addItem("Телефон");
print_r($order->getItems()); // ✅ ["Телефон"]
🟠Разделение ответственности внутри класса
Инкапсуляция помогает отделить внутреннюю логику от интерфейса.
class BankAccount {
private float $balance = 0;
private function logTransaction(float $amount) {
echo "Транзакция: $amount\n";
}
public function deposit(float $amount) {
$this->balance += $amount;
$this->logTransaction($amount);
}
public function getBalance(): float {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance(); // ✅ 100
Ставь 👍 и забирай 📚 Базу знаний🤔 Что содержит инкапсуляция кроме сокрытия данных?
1. Контроль доступа: использование модификаторов public, protected, private для ограничения доступа.
2. Инкапсуляция логики: методы класса предоставляют контролируемый интерфейс для работы с данными.
3. Сохранение целостности: защита данных от некорректных изменений извне.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Яндекс Музыка до 360 дней бесплатно
Яндекс Музыка для вас и 3-х ваших близких.
Кинопоиск и Яндекс Книги тоже в мультиподписке Плюс.
Попробуйте бесплатно❤️
Слушать
#реклама 18+
music.yandex.ru
О рекламодателе
🤔 Что такое SOLID?
Это акроним, представляющий пять основных принципов ООП и проектирования, предложенных Робертом Мартином. Эти принципы направлены на повышение гибкости, читаемости, и поддерживаемости кода, а также упрощение его тестирования и рефакторинга. Вот они:
🟠S: Принцип единственной ответственности (Single Responsibility Principle)
Каждый класс должен иметь только одну причину для изменения. Этот принцип подчеркивает, что класс должен заниматься только одной задачей или иметь одну область ответственности.
🟠O: Принцип открытости/закрытости (Open/Closed Principle)
Сущности программы должны быть открыты для расширения, но закрыты для модификации. Это означает, что можно добавлять новые функциональности без изменения существующего кода.
🟠L: Принцип подстановки Барбары Лисков (Liskov Substitution Principle)
Объекты в программе можно заменять их наследниками без изменения свойств программы. Это предполагает, что объекты подклассов должны действовать так же, как объекты суперкласса, от которых они произошли.
🟠I: Принцип разделения интерфейса (Interface Segregation Principle)
Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип говорит о том, что лучше иметь много специализированных интерфейсов, чем один универсальный.
🟠D: Принцип инверсии зависимостей (Dependency Inversion Principle)
Модули высокого уровня не должны зависеть от модулей низкого уровня. Обе категории должны зависеть от абстракций. Кроме того, абстракции не должны зависеть от деталей; детали должны зависеть от абстракций. Это способствует ослаблению связности компонентов системы.
Ставь 👍 и забирай 📚 Базу знаний
🚨60 минут
Пожизненный PRO-доступ на easyoffer (подготовка к IT-собесам + поиск оффера) по цене одного года закрывается прямо сейчас. Один платёж — доступ навсегда.
Последнее напоминание 👇
👉 https://easyoffer.ru/pro
Услуги дата-центра в Москве
Размещение и аренда серверного оборудования в дата-центре.
👍 4 современных дата-центра в Москве.
👍 Лицензированный оператор связи.
👍 Индивидуальные конфигурации выделенных серверов под задачи клиента.
👍 Круглосуточная техническая поддержка в Телеграм, без ботов.
Узнать цену
#реклама 16+
itsoft.ru
О рекламодателе
⚠️ 3 часа до конца акции.
Последний шанс забрать пожизненный PRO на easyoffer по цене одного года. Это полный доступ к подготовке к собесам и инструментам поиска работы (вопросы с реальных интервью, ответы сеньоров, автоотклики, тренажёры) — один раз и навсегда, вместо ежегодной оплаты.
В полночь цена возвращается к обычной.
👉 https://easyoffer.ru/pro
Регистрируйтесь на Yandex Scale 2026
Главная конференция Yandex Cloud.
Узнайте о сервисах, которые меняют ваш бизнес.
4 офлайн-трека (AI, Infra + DevTools, Data, Security), онлайн-трек Deep Tech, воркшопы по ИИ и интерактивы. Подробнее о программе читайте в карточках🗒
📅24 сентября
🚗Москва + 💻онлайн
Участие бесплатное!
Зарегистрироваться
#реклама 16+
scale.yandex.cloud
О рекламодателе
🤔 Как сделать так, чтобы сессии не хранились в файле?
Для хранения сессий не в файлах в PHP, можно использовать другие механизмы хранения, такие как базы данных, кэш-сервисы (например, Redis или Memcached) или специализированные хранилища.
🚩Хранение сессий в базе данных
1⃣Создайте таблицу для хранения сессий:
CREATE TABLE sessions (
id VARCHAR(255) PRIMARY KEY,
data TEXT,
last_access TIMESTAMP
);
2⃣Создайте обработчики сессий:
Создайте класс для обработки сессий, реализующий интерфейс SessionHandlerInterface.
class DBSessionHandler implements SessionHandlerInterface {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function open($savePath, $sessionName) {
return true;
}
public function close() {
return true;
}
public function read($id) {
$stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->execute();
$session = $stmt->fetch(PDO::FETCH_ASSOC);
return $session ? $session['data'] : '';
}
public function write($id, $data) {
$stmt = $this->pdo->prepare("REPLACE INTO sessions (id, data, last_access) VALUES (:id, :data, NOW())");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':data', $data);
return $stmt->execute();
}
public function destroy($id) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = :id");
$stmt->bindParam(':id', $id);
return $stmt->execute();
}
public function gc($maxlifetime) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < NOW() - INTERVAL :maxlifetime SECOND");
$stmt->bindParam(':maxlifetime', $maxlifetime, PDO::PARAM_INT);
return $stmt->execute();
}
}
3⃣Инициализация сессий:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$handler = new DBSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();
🚩Хранение сессий в Redis
1⃣Установите расширение `phpredis`Для Ubuntu:
sudo apt-get install php-redis
2⃣Используйте Redis для хранения сессий:
Настройте PHP для использования Redis в качестве хранилища сессий, добавив настройки в файл php.ini или в коде.
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
Ставь 👍 и забирай 📚 Базу знаний