es
Feedback
PHP | Вопросы собесов

PHP | Вопросы собесов

Ir al canal en Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

Mostrar más
2 341
Suscriptores
-224 horas
-57 días
-2330 días
Archivo de publicaciones
🤔 В чем преимущество Hash-индекса и B-Tree индекса? - Hash Index - Быстрый поиск по точному значению (например, id = 100). - Неэффективен при диапазонных запросах (>, <). - B-Tree Index - Хорошо работает с диапазонными запросами (BETWEEN, ORDER BY). - Может быть медленнее, чем Hash при точном поиске. Выбор индекса зависит от типа запроса. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Как синхронизировать команду? Пригласить в Битрикс24. Бесплатный онлайн-сервис для бизнеса и совместной работы. Мессенджер, CRM для продаж, Видеозвонки, Задачи, Календарь, Файлы и ИИ-помощник. Заберите бесплатно 10+ инструментов в одном сервисе. Зарегистрироваться #реклама 16+ office-online.bitrix24.ru О рекламодателе

🤔 Что такое namespaces? Это механизм, позволяющий организовать код в логические группы и избежать конфликтов имен, особенно в больших проектах или при использовании сторонних библиотек. 🚩Зачем они нужны? 🟠Избежание конфликтов имен В больших проектах могут быть сотни классов, функций и констант. Пространства имен помогают избежать ситуаций, когда разные части кода используют одинаковые имена. 🟠Упрощение организации кода Они позволяют группировать связанные классы, интерфейсы, функции и константы, что делает код более читаемым и поддерживаемым. 🟠Упрощение автозагрузки Пространства имен облегчают использование автозагрузчиков, таких как PSR-4, где классы и файлы организованы в соответствии с их пространствами имен. 🚩Как их использовать? Для использования пространств имен, нужно объявить их в начале файла с помощью ключевого слова namespace.
<?php
namespace MyProject\Models;

class User {
    public function getName() {
        return "John Doe";
    }
}
?>

Теперь класс User находится в пространстве имен MyProject\Models. Чтобы использовать этот класс в другом файле, нужно указать его полное имя:
<?php
require 'User.php';

$user = new \MyProject\Models\User();
echo $user->getName();
?>

Можно также использовать ключевое слово use для упрощения кода:
<?php
require 'User.php';

use MyProject\Models\User;

$user = new User();
echo $user->getName();
?>

Пространства имен могут содержать не только классы, но и функции и константы:
<?php
namespace MyProject\Utils;

const PI = 3.14;

function calculateCircleArea($radius) {
    return PI * $radius * $radius;
}
?>

Использование этих элементов будет аналогичным:
<?php
require 'Utils.php';

echo \MyProject\Utils\calculateCircleArea(5);
echo \MyProject\Utils\PI;
?>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какой принцип нарушает Active Record? Active Record нарушает Single Responsibility Principle (SRP), так как: - Объединяет логику работы с базой данных и логику бизнес-процессов в одном классе. - Это делает код менее гибким и сложным в поддержке. - Альтернативой является Repository + Data Mapper, где разделены логика бизнес-правил и взаимодействие с БД. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем отличие адаптера от декоратора? Это структурные паттерны проектирования, которые используются в объектно-ориентированном программировании для решения различных задач по структурированию классов и объектов. Несмотря на то, что оба паттерна оборачивают другие объекты, их цели и способы применения различаются. 🚩Адаптер (Adapter) Преобразовать интерфейс одного класса в интерфейс другого класса, который ожидают клиенты. Адаптер позволяет классам с несовместимыми интерфейсами работать вместе. Адаптер реализует интерфейс, который должен быть представлен клиенту, и перенаправляет вызовы клиента к объекту с другим интерфейсом. Важно, что адаптер изменяет интерфейс взаимодействия, но не добавляет новую функциональность. Вы разрабатываете приложение, которое должно использовать существующую библиотеку классов, интерфейсы которой не совместимы с остальной частью вашего приложения. Создав адаптер для этих классов, вы можете интегрировать библиотеку без изменения её кода или кода приложения. 🚩Декоратор (Decorator) Динамически добавить новую функциональность объекту. В отличие от наследования, декораторы предоставляют гибкий способ расширения функциональности объекта во время выполнения. Декоратор оборачивает исходный объект, предоставляя дополнительное поведение. Он имеет тот же базовый интерфейс, что и оборачиваемый объект, что позволяет использовать декораторы взаимозаменяемо с исходными объектами. Вы разрабатываете систему уведомлений и хотите добавить возможность логирования или шифрования сообщений. Создав декораторы для базового класса отправки сообщений, вы можете легко добавить новую функциональность, обернув базовый объект отправки в один или несколько декораторов. 🚩Отличия 🟠Цель применения Адаптер используется для обеспечения совместимости между различными интерфейсами, позволяя объектам с несовместимыми интерфейсами работать вместе. Декоратор добавляет новую функциональность объектам, не изменяя их интерфейсы. 🟠Изменение интерфейса Адаптер изменяет интерфейс объекта для совместимости с другим интерфейсом. Декоратор не изменяет интерфейс, но добавляет новое поведение, сохраняя при этом оригинальный интерфейс объекта. 🟠Добавление функциональности Декораторы предназначены для добавления новой функциональности объектам. Адаптеры не добавляют новую функциональность; их основная задача — обеспечить работу существующей функциональности через другой интерфейс. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие модификаторы видимости существуют? 1. public – доступен везде. 2. protected – доступен в классе и его наследниках. 3. private – доступен только в текущем классе. Также есть final (запрещает наследование) и static (метод принадлежит классу, а не объекту). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое транзакции? Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка. 🟠Atomicity (Атомарность) Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;    
🟠Consistency (Согласованность) Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям. 🟠Isolation (Изолированность) Обеспечивает изолированность транзакций друг от друга. Это означает, что результаты промежуточных операций одной транзакции невидимы для других транзакций до завершения первой транзакции. 🟠Durability (Долговечность) Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы. 🚩Использования транзакций 🟠Перевод денег между счетами Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

COMMIT; -- Если обе операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка    
🟠Создание заказа в интернет-магазине Важно убедиться, что все связанные операции (добавление записи о заказе, обновление статуса товаров, запись данных о платеже) выполнены успешно.
BEGIN TRANSACTION;

INSERT INTO orders (user_id, order_date) VALUES (1, NOW());
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO payments (order_id, amount) VALUES (LAST_INSERT_ID(), 99.99);

COMMIT; -- Если все операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка   
Ставь 👍 и забирай 📚 Базу знаний

Курс "Дизайн карточек для WB и Ozon". Бесплатно и с нуля Дизайнер карточек для маркетплейсов — востребованная и доходная проф
Курс "Дизайн карточек для WB и Ozon". Бесплатно и с нуля Дизайнер карточек для маркетплейсов — востребованная и доходная профессия 💰 Научись ей бесплатно! - Бесплатный доступ к курсу - Разбор ДЗ от наставника - Мощные кейсы в портфолио Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе

🤔 Что такое внешний ключ? Это ссылка в одной таблице на первичный ключ другой таблицы. Зачем нужен? • Обеспечивает целостность данных. • Предотвращает удаление связанных данных. • Оптимизирует SQL-запросы за счет индексов. Пример: В таблице Orders поле user_id может ссылаться на id в таблице Users. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Битрикс24 💻Один онлайн-сервис для совместной работы. 📱10+ инструментов. ✅0 денег. Счастливые сотрудники. Прибыльный бизнес. Регистрируйтесь и забирайте себе Зарегистрироваться #реклама 16+ office-online.bitrix24.ru О рекламодателе

🤔 Какие виды запросов есть? В контексте веб-разработки и работы с API, "виды запросов" обычно относятся к HTTP-методам. HTTP-методы — это стандартизированные типы запросов, которые определяют действие, требуемое от веб-сервера. Каждый метод указывает на определённый тип операции над ресурсами. Вот основные методы (виды запросов), используемые в веб-разработке: 🟠GET Назначение: Запрос содержимого указанного ресурса. GET-запросы должны быть идемпотентными, что означает, что их многократное выполнение приводит к одному и тому же результату и не изменяет состояние сервера. Пример использования: Запрос веб-страницы или изображения. 🟠POST Назначение: Отправка данных на сервер для создания нового ресурса. Данные отправляются в теле запроса. POST-запросы не идемпотентны, то есть многократное выполнение может приводить к разным результатам. Пример использования: Отправка формы на веб-сайте. 🟠PUT Назначение: Обновление существующего ресурса или создание нового ресурса по указанному URI. В отличие от POST, PUT идемпотентен. Пример использования: Обновление деталей пользователя. 🟠DELETE Назначение: Удаление указанного ресурса. Пример использования: Удаление записи из базы данных. 🟠PATCH Назначение: Частичное обновление существующего ресурса. PATCH может быть не идемпотентным, в зависимости от того, как он реализован на сервере. Пример использования: Обновление части данных пользователя, например, смена пароля. 🟠HEAD Назначение: Аналогичен GET, но сервер возвращает только заголовки ответа без тела. Используется для извлечения метаданных. Пример использования: Проверка существования ресурса или его последнего обновления. 🟠OPTIONS Назначение: Определение возможностей веб-сервера или параметров подключения для конкретного ресурса. Пример использования: Определение поддерживаемых методов HTTP для URL. 🟠TRACE Назначение: Эхо-запрос. Возвращает в теле ответа полученный запрос. Это может использоваться для диагностики. Из-за соображений безопасности его поддержка на серверах часто отключена. Пример использования: Отладка веб-запросов. Ставь 👍 и забирай 📚 Базу знаний

Партнёрская программа рекрутинга в Яндекс Еду Станьте партнёром Яндекс Еды по привлечению курьеров и получите кучу преимущест
Партнёрская программа рекрутинга в Яндекс Еду Станьте партнёром Яндекс Еды по привлечению курьеров и получите кучу преимуществ: 💰Платим до 47 000 ₽ за успешного кандидата 📞Поддержка на всех этапах 📅Свободное расписание 📊Удобные инструменты для работы Приводите новых курьеров и получайте в среднем 250 000 ₽ в месяц! Зарегистрироваться #реклама eda.yandex.ru О рекламодателе Реклама на Яндексе

🤔 Что такое REST? Это архитектурный стиль взаимодействия между клиентом и сервером через HTTP. Принципы REST: 1. Клиент-серверная архитектура – разделение клиентской и серверной логики. 2. Отсутствие состояния (Stateless) – каждый запрос содержит всю необходимую информацию. 3. Кэширование – позволяет уменьшить нагрузку на сервер. 4. Единообразие интерфейса – использование стандартных методов HTTP (GET, POST, PUT, DELETE). 5. Многоуровневая система (Layered System) – клиент не знает о внутренней реализации сервера. 6. Код по запросу (Code on Demand) – возможность загрузки кода для исполнения на клиенте (редко используется). REST API используют JSON или XML для передачи данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое абстрагирование? Это принцип программирования и проектирования, который позволяет выделить важные характеристики объекта или системы и скрыть их сложные детали. Основная цель абстрагирования – упростить сложные системы, делая их более понятными и управляемыми, сосредоточив внимание на их основных аспектах и поведении. 🚩Зачем нужно абстрагирование 🟠Снижение сложности Сокращает количество деталей, с которыми нужно работать, что облегчает понимание и работу с системой. 🟠Повышение читаемости кода Упрощает код, делая его более читаемым и легким для поддержки. 🟠Повторное использование кода Создаёт возможность повторного использования общих функций и логики. 🟠Инкапсуляция Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия. 🟠Гибкость и расширяемость Облегчает добавление новых функциональностей без изменения существующего кода. 🚩Как используется абстрагирование Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП). 🚩Пример абстракции с использованием классов и интерфейсов 🟠Интерфейс Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
    public function draw();
}
🟠Классы, реализующие интерфейс Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
    public function draw() {
        echo "Drawing a circle";
    }
}

class Square implements Shape {
    public function draw() {
        echo "Drawing a square";
    }
}
Использование абстракции
function renderShape(Shape $shape) {
    $shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square
🚩Плюсы и минусы Снижение сложности Абстракция скрывает сложные детали реализации, облегчая работу с системой. ➕Улучшение читаемости Код становится более понятным и структурированным. ➕Гибкость и расширяемость Облегчает добавление новых функций и изменений. ➕Повторное использование Позволяет использовать общий код в разных частях программы. ➖Избыточность Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно. ➖Накладные расходы Может потребоваться больше времени и усилий на создание абстракций и их поддержку. Ставь 👍 и забирай 📚 Базу знаний

Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как
Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как привлечь целевую аудиторию 💰👌 Попробовать #реклама yandex.ru О рекламодателе

🤔 Как использовать регуляторы? Регуляторы (регулярные выражения, RegEx) используются для поиска, фильтрации и замены строк. Используются в: - Поиске текста (preg_match) – находит совпадения в строке. - Замене (preg_replace) – заменяет части строки по шаблону. - Разбиении строки (preg_split) – разбивает строку по шаблону. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие виды уязвимости знаешь? В веб-разработке существует множество уязвимостей, но самые распространенные 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>
  
Ставь 👍 и забирай 📚 Базу знаний

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск
Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте сейчас❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

🤔 Влияет ли на что-то Foreign Key? Да, Foreign Key (внешний ключ) гарантирует целостность данных, предотвращая удаление или изменение связанных записей. Влияние Foreign Key: - Ограничивает удаление (ON DELETE RESTRICT) – нельзя удалить запись, на которую есть ссылки. - Каскадное удаление (ON DELETE CASCADE) – при удалении одной записи удаляются все связанные. - Обновление (ON UPDATE CASCADE) – если изменяется ключ в родительской таблице, он меняется и в дочерней. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое CQRS? CQRS (Command Query Responsibility Segregation) – это архитектурный паттерн, который разделяет операции чтения (Query) и записи (Command) в приложении. Вместо одной модели данных используется две: Модель для чтения – оптимизирована для запросов. Модель для записи – отвечает за изменение данных. 🚩Зачем нужен CQRS? 🟠Производительность запросы можно кэшировать, а запись может происходить в другой базе. 🟠Гибкость можно использовать разные структуры данных для чтения и записи. 🟠Масштабируемость можно масштабировать чтение и запись отдельно. 🟠Безопасность можно ограничить доступ к записи. 🚩Как это работает? В классическом приложении чтение и запись используют одну модель данных
class User {
    public $id;
    public $name;
    public $email;
    
    public function updateEmail($newEmail) {
        $this->email = $newEmail;
    }
}
Команда (Command) – запись
class UpdateUserEmailCommand {
    public int $userId;
    public string $newEmail;
    
    public function __construct($userId, $newEmail) {
        $this->userId = $userId;
        $this->newEmail = $newEmail;
    }
}

class UserCommandHandler {
    public function handle(UpdateUserEmailCommand $command) {
        // Логика обновления в БД
        $db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
        $stmt = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
        $stmt->execute([
            ':email' => $command->newEmail,
            ':id' => $command->userId
        ]);
    }
}
Запрос (Query) – чтение
class UserQueryHandler {
    public function getUserById($userId) {
        $db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
        $stmt = $db->prepare("SELECT id, name, email FROM users WHERE id = :id");
        $stmt->execute([':id' => $userId]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}
🚩CQRS + Event Sourcing Часто CQRS используется вместе с Event Sourcing – вместо изменения данных мы создаем события.
class UserEmailUpdatedEvent {
    public int $userId;
    public string $newEmail;
    
    public function __construct($userId, $newEmail) {
        $this->userId = $userId;
        $this->newEmail = $newEmail;
    }
}
Ставь 👍 и забирай 📚 Базу знаний