PHP | Вопросы собесов
Открыть в Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Больше2 341
Подписчики
-124 часа
-47 дней
-2430 день
Архив постов
🤔 Какие бывают индексы?
Индексы в базах данных — это структуры, которые ускоряют доступ к данным, создавая отдельную таблицу с ссылками на строки данных. Основные типы индексов включают первичные (primary key), уникальные (unique), и обычные индексы (index). Индексы помогают оптимизировать запросы к базам данных, но увеличивают накладные расходы на вставку и обновление данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как с MVI обрабатывать события, которые не нужно хранить?
Популярна в мобильной разработке, особенно в Android, но её концепции могут быть адаптированы и для веб-разработки, включая PHP. В MVI основное внимание уделяется однонаправленному потоку данных и управлению состоянием.
🚩Инструменты
🟠Model (Модель)
Представляет данные и бизнес-логику.
🟠View (Представление)
Отображает данные и реагирует на действия пользователя.
🟠Intent (Интент)
Определяет намерения пользователя (действия), которые изменяют состояние модели.
🚩Обработка временных событий
Это такие события, которые не должны сохраняться в состоянии модели. Примеры таких событий включают показ сообщений об ошибках, всплывающих окон, уведомлений и т.д.
🚩Подходы к обработке
🟠Одноразовые события (One-time Events)
Эти события обрабатываются и удаляются сразу после обработки. Показ уведомления об ошибке, которое исчезает после закрытия пользователем.
🟠Обратный вызов (Callback)
Использование обратных вызовов для обработки событий. Передача функции обратного вызова, которая вызывается при возникновении события.
🟠Временное состояние (Transient State)
Использование специальных флагов или объектов для временного хранения событий. Хранение флага для показа всплывающего сообщения.
🚩Пример реализации временного события в MVI
Предположим, что у нас есть событие показа сообщения об ошибке, которое не нужно хранить в модели.
// Model
class ErrorModel {
private $state;
public function __construct() {
$this->state = [];
}
public function getState() {
return $this->state;
}
public function showError($message) {
$this->state['error'] = $message;
}
public function clearError() {
unset($this->state['error']);
}
}
// Intent
class ErrorIntent {
protected $model;
public function __construct(ErrorModel $model) {
$this->model = $model;
}
public function triggerError($message) {
$this->model->showError($message);
}
public function clearError() {
$this->model->clearError();
}
}
// View
class ErrorView {
public function render($state) {
if (isset($state['error'])) {
echo "<div class='error'>{$state['error']}</div>";
}
}
}
// Контроллер (Связка View и Intent)
class ErrorController {
protected $view;
protected $intent;
public function __construct(ErrorView $view, ErrorIntent $intent) {
$this->view = $view;
$this->intent = $intent;
}
public function showError($message) {
$this->intent->triggerError($message);
$this->view->render($this->intent->getModel()->getState());
$this->intent->clearError(); // Событие обработано и очищено
}
}
// Использование
$model = new ErrorModel();
$intent = new ErrorIntent($model);
$view = new ErrorView();
$controller = new ErrorController($view, $intent);
// Триггер ошибки
$controller->showError("Произошла ошибка!");
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое интерфейсы?
Интерфейсы в PHP определяют набор методов, которые должны быть реализованы в классах, использующих этот интерфейс. Интерфейсы обеспечивают абстракцию, позволяя разработчикам определять общий функционал для классов, не предоставляя реализации методов. Классы могут реализовывать несколько интерфейсов, что делает их гибким инструментом для организации архитектуры кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Обучение на Frontend-разработчика. С нуля за 9 месяцев.
На курсе вы получите все навыки, необходимые для старта в профессии Frontend-разработчика.
Персональный наставник middle/senior уровня.
14 проектов, лайвкодинг, хакатоны, репетиции техсобеседования.
Освоите JavaScript, React, TypeScript
Официальный диплом и сертификат школы.
Поддержка наставника по JS в течение 3-х месяцев после диплома.
Гарантия трудоустройства. Если вы не устроитесь, вернём деньги. Это закреплено в договоре п. 6.14
Узнать больше
#реклама 16+
result.school
О рекламодателе
🤔 Какие бенефиты мы получаем от архитектуры?
Архитектура приложения обеспечивает модульность, масштабируемость и гибкость. Она упрощает управление сложностью системы, улучшает производительность и надёжность, позволяет легче вносить изменения и адаптироваться к новым требованиям. Также архитектура снижает риски и затраты на разработку и обслуживание, обеспечивая лучшую интеграцию с другими системами и более эффективное использование ресурсов.
🟠Масштабируемость
Хорошо продуманная архитектура позволяет легко добавлять новые функции и компоненты в систему без значительных изменений в существующем коде. Использование MVC (Model-View-Controller) позволяет разделить бизнес-логику, пользовательский интерфейс и управление данными. Это облегчает добавление новых функций без изменения всего кода.
🟠Поддерживаемость и расширяемость
Чёткая структура и модули позволяют разработчикам легко понимать и изменять код. Архитектура микросервисов, где каждое приложение делится на маленькие, независимые сервисы, что облегчает их обновление и поддержку.
🟠Повторное использование кода
Архитектурные паттерны и принципы способствуют созданию компонентов, которые можно использовать в разных частях приложения или даже в разных проектах. Создание библиотек и модулей, которые могут быть подключены к различным проектам, снижает дублирование кода и ускоряет разработку.
🟠Производительность и эффективность
Оптимизированная архитектура помогает улучшить производительность системы. Использование кэширования и распределённых систем хранения данных для быстрого доступа к часто запрашиваемой информации.
🟠Безопасность
Хорошо продуманная архитектура включает в себя меры по защите данных и предотвращению уязвимостей. Использование архитектуры с уровнями безопасности, где каждый уровень защищен по-своему, минимизирует риски взлома.
🟠Разделение обязанностей (Separation of Concerns)
Позволяет разделить различные аспекты системы, такие как бизнес-логика, данные и интерфейс, что облегчает их разработку и тестирование. В архитектуре MVC контроллер отвечает за обработку запросов и взаимодействие с моделью и представлением, что делает код более организованным.
Пример использования MVC
// Модель (Model)
class User {
public function getUserData($userId) {
// Код для получения данных пользователя из базы данных
}
}
// Контроллер (Controller)
class UserController {
protected $user;
public function __construct(User $user) {
$this->user = $user;
}
public function show($userId) {
$userData = $this->user->getUserData($userId);
include 'views/user.php';
}
}
// Представление (View)
// views/user.php
<?php foreach($userData as $data): ?>
<p><?php echo $data; ?></p>
<?php endforeach; ?>
Ставь 👍 и забирай 📚 Базу знаний😂 На одном кодинге уже давно не вывезешь, перспектива 2024 года - Информационная Безопасность
Ловите два канала на тему ИБ и хакинга
Арсенал Безопасника - Проект по кибербезопасности - сборник лучших инструментов и утилит по OSINT, хакингу и деанону
Бункер Хакера - Все что необходимо, для того чтобы начать свой путь в безопасности - инструменты, книги, справочники, гайды и ресурсы.
🤔 Зачем нужно ключевое слово final?
Ключевое слово final в PHP используется для того, чтобы запретить наследование классов или переопределение методов в дочерних классах. Это помогает защитить важные части кода от изменения и сохранять логику в неприкосновенности. Final используется для обеспечения предсказуемости поведения в классах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Запустите рекламу в телеграм-каналах с Яндекс Директом
Перфоманс-реклама теперь в телеграм-каналах ⚡
Яндекс Директ знает, как привлечь целевую аудиторию 💰👌
Попробовать
#реклама
yandex.ru
О рекламодателе
🤔 Когда имеет смысл использовать event sourcing?
Это паттерн проектирования, при котором все изменения состояния приложения сохраняются как последовательность событий. Вместо хранения только текущего состояния системы, каждая операция записывается как отдельное событие. Это позволяет восстанавливать состояние системы на любой момент времени, просто воспроизведя все события до этого момента.
🚩Когда имеет смысл?
🟠Необходимость аудита и отслеживания изменений
Если требуется вести полный аудит всех изменений данных, включая информацию о том, кто и когда вносил изменения, Event Sourcing предоставляет подробную историю событий.
🟠Восстановление состояния системы
При необходимости восстановления состояния системы на определённый момент времени Event Sourcing позволяет воспроизвести последовательность событий, что полезно для восстановления после сбоев.
🟠Поддержка сложных бизнес-правил
Если система имеет сложные бизнес-правила, которые изменяются с течением времени, Event Sourcing может помочь управлять этими изменениями и обеспечивать их прозрачность.
🟠Интеграция и согласованность данных
В системах, где важно поддерживать согласованность данных между различными сервисами и компонентами, Event Sourcing обеспечивает последовательность и целостность данных.
🟠Отказоустойчивость и масштабируемость
Event Sourcing часто используется в микросервисной архитектуре для повышения отказоустойчивости и масштабируемости системы. Каждый сервис может хранить свою собственную историю событий, а централизованный лог событий может служить для синхронизации между сервисами.
🟠Реализация CQRS (Command Query Responsibility Segregation)
Event Sourcing часто используется вместе с CQRS, где команды (commands) и запросы (queries) обрабатываются раздельно. Команды изменяют состояние через события, а запросы получают данные из проекций событий.
🚩Пример
Событие
class Event {
public $type;
public $data;
public $timestamp;
public function __construct($type, $data) {
$this->type = $type;
$this->data = $data;
$this->timestamp = time();
}
}
Агрегат
class ShoppingCart {
private $events = [];
private $items = [];
public function addItem($item) {
$event = new Event('ItemAdded', ['item' => $item]);
$this->apply($event);
$this->events[] = $event;
}
private function apply(Event $event) {
switch ($event->type) {
case 'ItemAdded':
$this->items[] = $event->data['item'];
break;
}
}
public function getItems() {
return $this->items;
}
public function getEvents() {
return $this->events;
}
}
Использование
$cart = new ShoppingCart();
$cart->addItem('Apple');
$cart->addItem('Banana');
echo "Current items in cart: " . implode(', ', $cart->getItems()) . "\n";
Восстановление состояния из событий
$replayedCart = new ShoppingCart();
foreach ($cart->getEvents() as $event) {
$replayedCart->apply($event);
}
echo "Replayed items in cart: " . implode(', ', $replayedCart->getItems()) . "\n";
Ставь 👍 и забирай 📚 Базу знаний📺 Уникальная база записей IT собеседований
180+ записей реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы.
Записи собесов от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.
🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
У тебя есть запись собеседования? Мы готовы ее купить и заплатим до 3000 руб. за каждую
🤔 Что такое traits?
Traits — это механизм PHP, который позволяет использовать повторно код в разных классах, без необходимости наследования. Traits содержат методы, которые можно внедрить в классы, что позволяет избегать дублирования кода. Они особенно полезны для разделения функциональности между классами, которые не могут наследоваться напрямую.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое иммутабельный объект?
Это объект, состояние которого не может быть изменено после его создания. В объектно-ориентированном программировании иммутабельность важна для обеспечения предсказуемости и безопасности данных, особенно в многопоточных и параллельных системах.
🟠Неизменяемость состояния
После создания объекта его поля и свойства не могут быть изменены.
🟠Создание новых объектов при изменении
Любые операции, которые изменяют состояние объекта, возвращают новый объект с изменённым состоянием, оставляя оригинальный объект неизменным.
🟠Безопасность в многопоточной среде
Иммутабельные объекты могут безопасно использоваться в многопоточных приложениях, поскольку они не изменяются и, следовательно, не требуют синхронизации.
🚩Плюсы
➕Простота понимания
Поскольку состояние объекта не меняется, легче предсказать его поведение.
➕Безопасность в многопоточности
Иммутабельные объекты не нуждаются в механизмах синхронизации, что упрощает разработку многопоточных приложений.
➕Отсутствие побочных эффектов
Функции, работающие с иммутабельными объектами, не изменяют их, что способствует более чистому и предсказуемому коду.
➕Кэширование и оптимизация
Поскольку иммутабельные объекты не меняются, их можно кэшировать и повторно использовать, что может улучшить производительность.
В этом примере класс
ImmutablePoint создаёт неизменяемые объекты. Метод withX создаёт новый объект с изменённым значением x, сохраняя оригинальный объект неизменным.
final class ImmutablePoint {
private $x;
private $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function getX() {
return $this->x;
}
public function getY() {
return $this->y;
}
public function withX($x) {
return new ImmutablePoint($x, $this->y);
}
public function withY($y) {
return new ImmutablePoint($this->x, $y);
}
}
// Пример использования
$point1 = new ImmutablePoint(10, 20);
echo $point1->getX(); // выводит: 10
echo $point1->getY(); // выводит: 20
$point2 = $point1->withX(30);
echo $point2->getX(); // выводит: 30
echo $point2->getY(); // выводит: 20
// Оригинальный объект не изменился
echo $point1->getX(); // выводит: 10
🚩Создание иммутабельных объектов с использованием неизменяемых коллекций
Коллекции могут быть полезны для работы с наборами данных, которые не должны изменяться после создания.
require 'vendor/autoload.php'; // если используете Composer
use \Ds\Vector;
$vector = new Vector([1, 2, 3]);
// Пример работы с неизменяемыми коллекциями
$newVector = $vector->copy();
$newVector->push(4);
echo $vector->count(); // выводит: 3
echo $newVector->count(); // выводит: 4
Ставь 👍 и забирай 📚 Базу знанийПерец на канале «Записки необычного препода» делает невозможное!
А именно — встраивает мышление на английском взрослым людям.
Как обычно пытаются научить «думать на языке»? Методом «бери больше, кидай дальше». Слушайте песни, смотрите фильмы, читайте книги в оригинале, и оно само как-нибудь запустится.
Тут всё совсем не так. Тут происходит встраивание языка на кардинально других принципах. В результате вы ощущаете грамматику и слова «изнутри». Так, как бы вы их ощущали, будь вы носителем английского языка.
Почитать подробнее про эту технологию можно тут.
Есть конкретный механизм мышления. Он состоит из визуального слоя, слоя смыслов и слоя слов. Механизм разбивается на элементы. Каждый элемент тренируется отдельно. Оттренированные элементы стыкуются друг с другом с помощью специальных упражнений.
Здесь:
- Пошаговая технология;
- Разбор механик мышления на языке;
- Простота — любое сложное упражнение должно быть разбито на простые.
- Измеримость — все упражнения тренируются до норматива (как правило в секундах). Норматив гарантирует освоение упражнения на уровне навыка.
- Сумма упражнений неизбежно приводит к мышлению на языке. Так же, как правильно собранные вместе детали создают автомобиль.
Вот, например:
- как найти английские артикли в русском;
- как освоить что угодно в 10 раз быстрее;
- как взломать английскую грамматику.
Подписывайся, чтобы узнать больше.
🤔 Какие типы данных есть в PHP?
В PHP есть восемь основных типов данных: четыре скалярных (integer, float, string, boolean) и четыре составных (array, object, callable, iterable). Также существуют два специальных типа: `resource` для ссылок на внешние ресурсы и `null` для отсутствия значения. Эти типы данных позволяют гибко работать с различными структурами данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем разница между Coupling и Cohesion?
Coupling — это мера зависимости между модулями; чем ниже связанность, тем лучше, так как изменения в одном модуле минимально влияют на другие. Cohesion — это мера того, насколько функции внутри модуля связаны между собой и работают над одной задачей; чем выше сцепление, тем лучше, так как модуль выполняет одну четко определенную функцию. Идеальная система имеет низкую связанность и высокое сцепление.
🚩Coupling (Связанность)
Описывает степень зависимости между различными модулями или компонентами системы. Она отражает, насколько изменения в одном модуле могут повлиять на другие модули.
🟠Высокая связанность (Tight Coupling)
Модули сильно зависят друг от друга. Изменение в одном модуле часто требует изменений в других модулях. Это делает систему менее гибкой и более трудной для модификации и тестирования.
🟠Низкая связанность (Loose Coupling)
Модули слабо зависят друг от друга. Изменения в одном модуле имеют минимальное влияние на другие модули. Это делает систему более гибкой, легко модифицируемой и тестируемой.
Высокая связанность
class Database {
public function connect() {
// Логика подключения к базе данных
}
}
class User {
private $db;
public function __construct() {
$this->db = new Database();
$this->db->connect();
}
}
🟠Низкая связанность
Класс User меньше зависит от класса Database, так как зависимость передается через конструктор.
class Database {
public function connect() {
// Логика подключения к базе данных
}
}
class User {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function connectToDatabase() {
$this->db->connect();
}
}
🚩Cohesion (Сцепление)
Описывает, насколько элементы внутри одного модуля связаны друг с другом. Оно отражает, насколько функционально связанные элементы объединены в одном модуле.
🟠Высокое сцепление (High Cohesion)
Модуль отвечает за одночетко определенное действие или группу связанных действий. Это делает модуль более понятным, поддерживаемым и переиспользуемым.
🟠Низкое сцепление (Low Cohesion)
Модуль отвечает за множество разнородных действий. Это делает модуль сложным для понимания и поддержки.
Низкое сцепление
class Utility {
public function calculate() {
// Логика расчета
}
public function formatString($string) {
// Логика форматирования строки
}
public function connectToDatabase() {
// Логика подключения к базе данных
}
}
🟠Высокое сцепление
Каждая класс отвечает за конкретную задачу, что делает их более понятными и легко поддерживаемыми.
class Calculator {
public function calculate() {
// Логика расчета
}
}
class StringFormatter {
public function formatString($string) {
// Логика форматирования строки
}
}
class DatabaseConnector {
public function connectToDatabase() {
// Логика подключения к базе данных
}
}
Ставь 👍 и забирай 📚 Базу знанийПрограммист — лекарство от больных тимлидов, тупых багов и тех самых митов в 10 утра ☠️
Здесь собирают лучшие мемы про айтишников, чтобы спасти вашу психику от died'осов на работе.
Идеально зачиллить вечерком и скинуть друзьям: @progeri
🤔 Что такое в мире PHP PSR и RFC?
PSR (PHP Standards Recommendations) — это набор стандартов и рекомендаций для написания кода в PHP, таких как PSR-1, PSR-2 для стиля кода, PSR-4 для автозагрузки классов. RFC (Request for Comments) — это предложения по улучшению PHP, которые обсуждаются и принимаются сообществом, формируя новые возможности и изменения в языке. Оба механизма способствуют стандартизации и улучшению качества кода в PHP-сообществе.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое односвязный список?
Это структура данных, состоящая из узлов, где каждый узел содержит данные и указатель на следующий узел в списке. Односвязные списки используются для динамического хранения данных и предоставляют эффективные операции вставки и удаления элементов.
🟠Узел (Node)
Каждый узел содержит два элемента: данные и ссылку (указатель) на следующий узел.
🟠Голова списка (Head)
Ссылка на первый узел списка. Если список пуст, голова указывает на
null.
🚩Основные операции
🟠Добавление узла в начало списка
Новый узел становится головой списка, а его указатель указывает на предыдущую голову.
🟠Добавление узла в конец списка
Пройти по списку до последнего узла и установить его указатель на новый узел.
🟠Удаление узла
Найти узел с заданным значением и перенаправить указатель предыдущего узла на следующий узел.
class Node {
public $data;
public $next;
public function __construct($data) {
$this->data = $data;
$this->next = null;
}
}
class LinkedList {
private $head;
public function __construct() {
$this->head = null;
}
public function addFirst($data) {
$newNode = new Node($data);
$newNode->next = $this->head;
$this->head = $newNode;
}
public function addLast($data) {
$newNode = new Node($data);
if ($this->head === null) {
$this->head = $newNode;
} else {
$current = $this->head;
while ($current->next !== null) {
$current = $current->next;
}
$current->next = $newNode;
}
}
public function remove($data) {
if ($this->head === null) return;
if ($this->head->data === $data) {
$this->head = $this->head->next;
return;
}
$current = $this->head;
while ($current->next !== null && $current->next->data !== $data) {
$current = $current->next;
}
if ($current->next !== null) {
$current->next = $current->next->next;
}
}
public function search($data) {
$current = $this->head;
while ($current !== null) {
if ($current->data === $data) {
return true;
}
$current = $current->next;
}
return false;
}
public function display() {
$current = $this->head;
while ($current !== null) {
echo $current->data . " ";
$current = $current->next;
}
echo "\n";
}
}
// Пример использования
$list = new LinkedList();
$list.addFirst(10);
$list.addFirst(20);
$list.addLast(30);
$list.display(); // Вывод: 20 10 30
$list.remove(10);
$list.display(); // Вывод: 20 30
echo $list.search(20) ? "Found\n" : "Not Found\n"; // Вывод: Found
Ставь 👍 и забирай 📚 Базу знаний⚡️ Вся база знаний по IT в одном месте!
🧑💻 IT База — краткие разборы самого важного из мира IT. Сотни мастхев-ресурсов, каждый день новые материалы по работе и подготовке к собеседованиям. Подойдёт как новичкам, так и состоявшимся айтишникам;
🖥 Frontend База — всё для фронтенд разработчиков. Готовые решения для проектов, полезные курсы по JS/HTML/CSS, готовые роадмапы для комфортного освоения в профессии и дальнейшего развития;
👣 Backend База — самое важное для бэкендеров. Всё о работе с PHP, MySQL, MongoDB, Golang и Rust в одном месте, плюс полные курсы и лайфхаки для работы на каждый день;
🖥 База Знаний — склад полезных курсов и материалов, где легко найти что-то нужное по хэштегам. Если вам что-то интересно про IT, то оно уже лежит на Базе, проверяйте.
⏲ Успей подписаться, чтобы не потерять!
🤔 В каких случаях используют индексы?
Индексы в базах данных используются для ускорения операций поиска и сортировки данных. Они создаются на столбцах, по которым часто выполняются запросы, такие как `SELECT`, `WHERE` или `ORDER BY`. Индексы позволяют базе данных быстро находить нужные записи без необходимости сканировать всю таблицу. Однако индексы занимают дополнительное место и могут замедлять операции вставки и обновления данных, поэтому их следует использовать с осторожностью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
