PHP | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
نمایش بیشتر2 344
مشترکین
+124 ساعت
اطلاعاتی وجود ندارد7 روز
-2330 روز
آرشیو پست ها
Как устроен декоратор ?
Спросят с вероятностью 13%
Декоратор — это структурный паттерн проектирования, который позволяет добавлять объектам новые обязанности динамически, оборачивая их в полезные "обёртки". В отличие от наследования, декораторы предлагают гибкий способ расширять функциональность объекта, не изменяя его исходный код или поведение других объектов того же класса. Полезны для соблюдения принципа открытости/закрытости, одного из пяти основных принципов SOLID в объектно-ориентированном дизайне.
Структура
Декоратор обычно состоит из следующих компонентов:
1️⃣Компонент (Component): Определяет интерфейс для объектов, которым могут быть добавлены дополнительные обязанности динамически.
2️⃣Конкретный Компонент (Concrete Component): Определяет объект, к которому дополнительные обязанности могут быть добавлены.
3️⃣Декоратор (Decorator): Содержит компонент, к которому нужно добавить новые обязанности. Имеет тот же базовый интерфейс, что и компоненты, которые он декорирует, что позволяет использовать декорированные объекты так же, как и оригинальные.
4️⃣Конкретные Декораторы (Concrete Decorators): Добавляют новые обязанности к компоненту, которые находятся внутри.
Принцип работы
1️⃣Оборачивание: Декоратор "оборачивает" или "декорирует" компонент, предоставляя тем самым расширенный интерфейс с дополнительными обязанностями. Клиентский код, использующий декоратор, работает с расширенным интерфейсом, не зная о наличии декорации.
2️⃣Делегирование: Декоратор делегирует работу обёрнутому компоненту, а затем добавляет свою логику до или после вызова основного компонента. Это позволяет выполнять дополнительные действия до или после основного поведения компонента.
3️⃣Композиция вместо наследования: Вместо использования наследования для расширения поведения объекта, декораторы применяют композицию — объект декоратор содержит другой объект компонента и расширяет его функциональность.
Пример:
Декораторы часто используются для модификации функций и методов. Пример ниже показывает, как декоратор может добавлять функциональность к функции:
def my_decorator(func):
def wrapper():
print("Что-то происходит до вызова функции.")
func()
print("Что-то происходит после вызова функции.")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
В этом примере, my_decorator является декоратором, который добавляет строки вывода до и после выполнения функции say_hello. Декораторы используют синтаксис @, который предшествует имени функции, которую нужно декорировать.
Декораторы предоставляют мощный инструмент для расширения и модификации поведения объектов и функций, поддерживая чистоту исходного кода и облегчая поддержку и расширение функциональности.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхЧто такое динамические переменные ?
Спросят с вероятностью 13%
Динамические переменные — это переменные, имена которых определяются во время выполнения программы. Это позволяет создавать, модифицировать или обращаться к переменным динамически, основываясь на входных данных или условиях выполнения программы. Такой подход может быть полезен в сценариях, где структура данных неизвестна на момент написания кода или когда нужно генерировать переменные на лету в зависимости от контекста выполнения.
PHP
Имена переменных могут быть динамически сформированы с использованием переменных переменных:
$name = "variable";
$$name = "Hello, World!";
echo $variable; // Выведет "Hello, World!"
Здесь $$name создаёт переменную с именем, хранящимся в $name, и присваивает ей значение "Hello, World!".
Преимущества:
✅Гибкость: позволяет создавать более адаптивные и динамические программы, которые могут работать с данными, структура которых заранее неизвестна.
✅Удобство: упрощает работу с большим количеством похожих переменных или свойств объекта без необходимости явного объявления каждой переменной.
Недостатки:
✅Читаемость кода: использование динамических переменных может сделать код менее понятным и труднее для отладки, поскольку не всегда ясно, какие переменные создаются и используются.
✅Управление памятью: динамическое создание большого количества переменных может привести к неэффективному использованию памяти и снижению производительности.
Использование динамических переменных требует внимательного подхода к проектированию приложения, чтобы избежать ошибок во время выполнения и обеспечить поддерживаемость и производительность кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхЧто такое транзакция ?
Спросят с вероятностью 40%
Транзакция в контексте баз данных — это последовательность операций с данными, которые рассматриваются как единое целое. Основная цель — обеспечить надежное выполнение группы операций, так чтобы база данных оставалась в согласованном состоянии даже в случае возникновения ошибок или сбоев. Подчиняются принципу ACID, который обеспечивает:
✅Атомарность (Atomicity): Выполняется полностью или не выполняется вовсе. Если какая-либо часть транзакции не может быть завершена, то все её действия откатываются (отменяются), и система возвращается к состоянию, которое было до начала транзакции.
✅Согласованность (Consistency): Переводит базу данных из одного согласованного состояния в другое. Это означает, что все правила целостности данных соблюдаются.
✅Изолированность (Isolation): Не видит промежуточных состояний других транзакций. Это предотвращает возможные проблемы, такие как "грязное чтение" или "неповторяемое чтение".
✅Долговечность (Durability): После ее завершения (commit) её результаты сохраняются в базе данных независимо от последующих сбоев системы.
Они используются для выполнения различных задач, таких как перевод средств между банковскими счетами, обновление инвентаря в системах управления товарами, изменения в системах управления пользователями и многие другие операции, требующие гарантий целостности данных.
Пример:
BEGIN TRANSACTION;
UPDATE БанковскиеСчета SET Баланс = Баланс - 100 WHERE НомерСчета = '123456';
UPDATE БанковскиеСчета SET Баланс = Баланс + 100 WHERE НомерСчета = '654321';
COMMIT;
В этом примере производится перевод средств между двумя банковскими счетами в рамках одной транзакции. Если обновление баланса на любом из счетов не может быть выполнено по любой причине (например, из-за сбоя в системе), транзакция будет отменена, и база данных вернется к исходному состоянию, тем самым гарантируя целостность данных.
Транзакция — это механизм, который позволяет группировать несколько операций с базой данных в одно целое для обеспечения ACID-гарантий, что критически важно для поддержания целостности и надежности данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхЧто происходит с запросом после его ввода в строку ?
Спросят с вероятностью 13%
Когда вы вводите запрос в адресную строку браузера и нажимаете Enter, происходит ряд действий, которые в конечном итоге приводят к отображению веб-страницы или другого ресурса. Вот основные этапы этого процесса:
1️⃣Разбор URL
Браузер анализирует введённый URL (Uniform Resource Locator), чтобы определить, к какому ресурсу нужно обратиться. URL содержит информацию о протоколе (например, HTTP или HTTPS), доменном имени или IP-адресе сервера и, возможно, пути к конкретному ресурсу на сервере.
2️⃣Поиск IP-адреса
Если в URL указано доменное имя, браузер должен определить соответствующий IP-адрес сервера. Для этого он сначала проверяет кэш DNS локальной системы и, если не находит там нужную информацию, обращается к DNS-серверу вашего интернет-провайдера или к другим DNS-серверам в сети для разрешения имени в IP-адрес.
3️⃣Установление соединения
После определения IP-адреса сервера браузер пытается установить с ним соединение, используя протокол TCP (Transmission Control Protocol) на порту 80 для HTTP или порту 443 для HTTPS. В случае использования HTTPS также происходит процесс рукопожатия SSL/TLS для установления защищённого соединения.
4️⃣Отправка HTTP-запроса
Как только соединение установлено, браузер формирует и отправляет HTTP-запрос к серверу. Запрос содержит метод запроса (например, GET для получения данных), URL запрашиваемого ресурса и заголовки, которые могут включать дополнительную информацию, такую как типы контента, которые браузер может корректно отобразить.
5️⃣Обработка запроса сервером
Сервер получает запрос, обрабатывает его и формирует ответ. Ответ может содержать запрошенный ресурс (например, HTML-страницу), статусный код ответа (например, 200 OK или 404 Not Found) и заголовки ответа, указывающие тип контента, размер ответа, кэширование и другие параметры.
6️⃣Загрузка ресурсов
Браузер получает ответ от сервера, интерпретирует полученный контент (например, HTML) и начинает загружать дополнительные ресурсы, такие как стили CSS, JavaScript-файлы, изображения и т. д., которые необходимы для полного отображения страницы. Эти ресурсы могут загружаться с того же сервера или с других серверов.
7️⃣Отображение страницы
После загрузки и обработки всех ресурсов браузер отображает веб-страницу пользователю. В этот момент могут начаться дополнительные действия, такие как выполнение JavaScript-кода, который может изменять содержимое страницы или даже загружать новые данные с сервера.
Этот процесс может варьироваться в зависимости от конкретных условий, таких как настройки кэширования, использование прокси-серверов, специфика веб-приложений и т. д.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое форматы запросов и ответов приложения ?
Спросят с вероятностью 13%
Форматы запросов и ответов приложения определяют, как данные передаются между клиентом (например, веб-браузером или мобильным приложением) и сервером в процессе их взаимодействия. Эти форматы являются частью протокола обмена данными и могут варьироваться в зависимости от архитектуры приложения, спецификации API и требований к безопасности и эффективности. Рассмотрим основные форматы запросов и ответов, используемые в современных веб-приложениях:
1️⃣HTML (HyperText Markup Language)
✅Использование: Основной формат для веб-страниц.
✅Характеристика: HTML-документы содержат теги, которые определяют структуру веб-страницы, включая текст, ссылки, изображения и другие элементы. Браузеры интерпретируют HTML-код и отображают его в виде веб-страницы.
2️⃣JSON (JavaScript Object Notation)
✅Использование: Популярный формат для передачи данных в API, особенно в RESTful и GraphQL API.
✅Характеристика: JSON представляет данные в легковесном текстовом формате, основанном на JavaScript, но является языково независимым. JSON хорошо подходит для сериализации сложных структур данных, таких как объекты и массивы.
3️⃣XML (eXtensible Markup Language)
✅Использование: Используется в веб-сервисах и конфигурациях; ранее был стандартом для многих API до появления JSON.
✅Характеристика: XML позволяет определять пользовательские теги для маркировки структуры данных, что делает его очень гибким, но менее компактным и менее читаемым, чем JSON.
4️⃣FormData
✅Использование: Используется для отправки данных форм и файлов с веб-страниц.
✅Характеристика: FormData позволяет компоновать пары ключ-значение для отправки данных форм, включая файлы, как
multipart/form-data, что необходимо при загрузке файлов на сервер.
5️⃣Plain Text
✅Использование: Простой текст может использоваться для простого обмена данными, где не требуется структура или для отладочных целей.
✅Характеристика: Отсутствие структурированности делает его менее предпочтительным для сложных данных, но его простота может быть полезной в некоторых сценариях.
6️⃣YAML (YAML Ain't Markup Language)
✅Использование: Используется для конфигураций, документации и в некоторых API.
✅Характеристика: YAML предназначен для удобства чтения и написания человеком и может использоваться для представления данных в иерархической форме. Он часто используется в конфигурационных файлах.
Отправка и получение данных
✅При отправке запроса к серверу (например, через веб-API), клиент указывает формат отправляемых данных, используя HTTP-заголовки, такие как Content-Type.
✅Аналогично, сервер использует HTTP-заголовки, например, Content-Type в ответе, чтобы сообщить клиенту в каком формате предоставлены возвращаемые данные.
Выбор формата зависит от конкретных требований приложения, необходимости взаимодействия с другими системами и предпочтений. JSON и HTML являются одними из самых распространённых форматов из-за их удобства и поддержки в современных веб-технологиях.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контентКакие виды запросов есть ?
Спросят с вероятностью 13%
В контексте веб-разработки и работы с API, "виды запросов" обычно относятся к HTTP-методам. HTTP-методы — это стандартизированные типы запросов, которые определяют действие, требуемое от веб-сервера. Каждый метод указывает на определённый тип операции над ресурсами. Вот основные методы (виды запросов), используемые в веб-разработке:
1️⃣GET
✅Назначение: Запрос содержимого указанного ресурса. GET-запросы должны быть идемпотентными, что означает, что их многократное выполнение приводит к одному и тому же результату и не изменяет состояние сервера.
✅Пример использования: Запрос веб-страницы или изображения.
2️⃣POST
✅Назначение: Отправка данных на сервер для создания нового ресурса. Данные отправляются в теле запроса. POST-запросы не идемпотентны, то есть многократное выполнение может приводить к разным результатам.
✅Пример использования: Отправка формы на веб-сайте.
3️⃣PUT
✅Назначение: Обновление существующего ресурса или создание нового ресурса по указанному URI. В отличие от POST, PUT идемпотентен.
✅Пример использования: Обновление деталей пользователя.
4️⃣DELETE
✅Назначение: Удаление указанного ресурса.
✅Пример использования: Удаление записи из базы данных.
5️⃣PATCH
✅Назначение: Частичное обновление существующего ресурса. PATCH может быть не идемпотентным, в зависимости от того, как он реализован на сервере.
✅Пример использования: Обновление части данных пользователя, например, смена пароля.
6️⃣HEAD
✅Назначение: Аналогичен GET, но сервер возвращает только заголовки ответа без тела. Используется для извлечения метаданных.
✅Пример использования: Проверка существования ресурса или его последнего обновления.
7️⃣OPTIONS
✅Назначение: Определение возможностей веб-сервера или параметров подключения для конкретного ресурса.
✅Пример использования: Определение поддерживаемых методов HTTP для URL.
8️⃣TRACE
✅Назначение: Эхо-запрос. Возвращает в теле ответа полученный запрос. Это может использоваться для диагностики. Из-за соображений безопасности его поддержка на серверах часто отключена.
✅Пример использования: Отладка веб-запросов.
Эти методы являются основой для RESTful API — архитектурного стиля взаимодействия компонентов распределённого приложения в сети. Корректное использование HTTP-методов позволяет разработчикам создавать интуитивно понятные и надёжные API.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
В чем отличие адаптера от декоратора ?
Спросят с вероятностью 13%
Адаптер и декоратор — это структурные паттерны проектирования, которые используются в объектно-ориентированном программировании для решения различных задач по структурированию классов и объектов. Несмотря на то, что оба паттерна оборачивают другие объекты, их цели и способы применения различаются.
Адаптер (Adapter)
Цель: Преобразовать интерфейс одного класса в интерфейс другого класса, который ожидают клиенты. Адаптер позволяет классам с несовместимыми интерфейсами работать вместе.
Как работает:
Адаптер реализует интерфейс, который должен быть представлен клиенту, и перенаправляет вызовы клиента к объекту с другим интерфейсом. Важно, что адаптер изменяет интерфейс взаимодействия, но не добавляет новую функциональность.
Пример использования:
Вы разрабатываете приложение, которое должно использовать существующую библиотеку классов, интерфейсы которой не совместимы с остальной частью вашего приложения. Создав адаптер для этих классов, вы можете интегрировать библиотеку без изменения её кода или кода приложения.
Декоратор (Decorator)
Цель: Динамически добавить новую функциональность объекту. В отличие от наследования, декораторы предоставляют гибкий способ расширения функциональности объекта во время выполнения.
Как работает:
Декоратор оборачивает исходный объект, предоставляя дополнительное поведение. Он имеет тот же базовый интерфейс, что и оборачиваемый объект, что позволяет использовать декораторы взаимозаменяемо с исходными объектами.
Пример использования:
Вы разрабатываете систему уведомлений и хотите добавить возможность логирования или шифрования сообщений. Создав декораторы для базового класса отправки сообщений, вы можете легко добавить новую функциональность, обернув базовый объект отправки в один или несколько декораторов.
Отличия
✅Цель применения: Адаптер используется для обеспечения совместимости между различными интерфейсами, позволяя объектам с несовместимыми интерфейсами работать вместе. Декоратор добавляет новую функциональность объектам, не изменяя их интерфейсы.
✅Изменение интерфейса: Адаптер изменяет интерфейс объекта для совместимости с другим интерфейсом. Декоратор не изменяет интерфейс, но добавляет новое поведение, сохраняя при этом оригинальный интерфейс объекта.
✅Добавление функциональности: Декораторы предназначены для добавления новой функциональности объектам. Адаптеры не добавляют новую функциональность; их основная задача — обеспечить работу существующей функциональности через другой интерфейс.
Выбор между адаптером и декоратором зависит от конкретной задачи: необходимости преодолеть различия в интерфейсах или же добавить новое поведение объекту.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
Расскажи о принципах SOLID ?
Спросят с вероятностью 40%
Принципы SOLID — это набор из пяти основных принципов ООП и проектирования, предложенных Робертом Мартином. Эти принципы помогают разработчикам создавать системы, которые легко поддаются масштабированию, понятны, удобны в поддержке и расширении. Применение их способствует снижению зависимостей между модулями программы, упрощает тестирование и обновление.
S - Принцип единственной ответственности (Single Responsibility Principle)
Он утверждает, что класс должен иметь только одну причину для изменения. Другими словами, класс должен выполнять только одну задачу или иметь одну область ответственности. Это упрощает понимание класса, его тестирование и поддержку.
O - Принцип открытости/закрытости (Open/Closed Principle)
Согласно этому ему, программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что можно добавлять новые функциональности не изменяя существующий код, что уменьшает вероятность внесения ошибок в уже проверенный и работающий код.
L - Принцип подстановки Барбары Лисков (Liskov Substitution Principle)
Этот принцип формулируется как: объекты в программе должны быть заменяемы на экземпляры их подтипов без изменения правильности выполнения программы. Проще говоря, производный класс должен дополнять, а не заменять поведение базового класса.
I - Принцип разделения интерфейса (Interface Segregation Principle)
Принцип разделения интерфейса гласит, что клиенты не должны быть вынуждены реализовывать интерфейсы, которые они не используют. Это означает, что лучше иметь множество специализированных интерфейсов, чем один универсальный.
D - Принцип инверсии зависимостей (Dependency Inversion Principle)
Принцип инверсии зависимостей состоит в том, что модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей должны зависеть от абстракций. Кроме того, абстракции не должны зависеть от деталей; детали должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимостей между модулями кода.
Применение принципов SOLID делает систему более гибкой, понятной и поддерживаемой. Каждый принцип помогает решать определенные проблемы проектирования и поддержки программного обеспечения, обеспечивая тем самым создание качественного и долговечного продукта.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое абстрактный класс ?
Спросят с вероятностью 47%
Абстрактный класс — это класс в ООП, который не может быть инстанциирован напрямую, то есть нельзя создать объект абстрактного класса используя оператор
new. Они предназначены для того, чтобы служить базой для других классов, которые должны реализовать определенные методы, заданные в нем.
Основная цель — обеспечение общего определения класса, которое может быть использовано в качестве основы для создания производных классов. Производные классы должны реализовать все абстрактные методы абстрактного родительского класса, но при этом они могут также иметь дополнительные методы и свойства или переопределять существующие.
Часто содержат абстрактные методы — методы, объявленные в абстрактном классе, но не имеющие реализации в нём. Реализация этих методов должна быть обеспечена в производных классах. Это позволяет им задавать форму и обязательные методы для всех своих наследников, не определяя при этом конкретную реализацию этих методов.
Могут также содержать полностью реализованные методы, конструкторы, деструкторы и свойства, которые могут быть использованы или переопределены в производных классах.
Пример:
abstract class Животное {
public function ест() {
echo "Это животное ест";
}
abstract public function издаетЗвук();
}
class Собака extends Животное {
public function издаетЗвук() {
echo "Гав";
}
}
// $животное = new Животное(); // Ошибка: нельзя инстанциировать абстрактный класс
$собака = new Собака();
$собака->ест(); // Вывод: Это животное ест
$собака->издаетЗвук(); // Вывод: Гав
В этом примере, Животное — это абстрактный класс с абстрактным методом издаетЗвук и обычным методом ест. Класс Собака наследует класс Животное и обязан реализовать абстрактный метод издаетЗвук. Создать экземпляр класса Животное напрямую нельзя, но можно использовать его для создания более конкретных классов животных, таких как Собака.
Абстрактный класс определяет шаблон для своих наследников и может задавать некоторые общие функции, которые будут использоваться или расширяться этими наследниками.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхКакие паттерны проектирования знаешь ?
Спросят с вероятностью 47%
Паттерны проектирования — это проверенные решения типичных проблем, возникающих при разработке программного обеспечения. Они помогают сделать код более модульным, гибким и поддерживаемым. Они делятся на три основные категории в зависимости от их предназначения:
Порождающие (Creational)
Связаны с процессом создания объектов, делая систему более независимой от способа создания, композиции и представления объектов.
✅Абстрактная фабрика (Abstract Factory): предоставляет интерфейс для создания семейств взаимосвязанных или зависимых объектов без указания их конкретных классов.
✅Строитель (Builder): отделяет конструирование сложного объекта от его представления, так что один и тот же процесс конструирования может создавать разные представления.
✅Фабричный метод (Factory Method): определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. Фабричный метод позволяет классу делегировать инстанцирование подклассам.
✅Прототип (Prototype): создаёт объекты путём копирования существующего объекта, а не создания нового через конструктор.
✅Одиночка (Singleton): гарантирует, что класс имеет только один экземпляр, и предоставляет к нему глобальную точку доступа.
Структурные (Structural)
Описывают, как объединить объекты и классы в более крупные структуры, сохраняя при этом гибкость и эффективность структур.
✅Адаптер (Adapter): позволяет объектам с несовместимыми интерфейсами работать вместе.
✅Мост (Bridge): разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо.
✅Компоновщик (Composite): позволяет группировать объекты в древовидные структуры для представления иерархий часть-целое.
✅Декоратор (Decorator): динамически добавляет объектам новые обязанности без изменения их интерфейса.
✅Фасад (Facade): предоставляет упрощённый интерфейс к сложной системе классов, библиотеке или фреймворку.
✅Легковес (Flyweight): используется для уменьшения затрат на создание большого количества мелких похожих объектов.
✅Заместитель (Proxy): предоставляет заменитель или местозаполнитель для другого объекта для контроля доступа к нему.
Поведенческие (Behavioral)
В основном описывают не столько шаблоны объектов или классов, сколько шаблоны взаимодействия между ними.
✅Цепочка обязанностей (Chain of Responsibility): передаёт запросы последовательно по цепочке обработчиков, пока один из них не обработает запрос.
✅Команда (Command): превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
✅Интерпретатор (Interpreter): задаёт грамматику для языка и интерпретатор для его грамматики.
✅Итератор (Iterator): предоставляет способ последовательного доступа ко всем элементам агрегата без раскрытия его внутреннего представления.
✅Посредник (Mediator): уменьшает сложность взаимодействия между объектами, введя между ними посредника.
✅Хранитель (Memento): позволяет сохранять и восстанавливать предыдущее состояние объекта без раскрытия деталей его реализации.
✅Наблюдатель (Observer): создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
✅Состояние (State): позволяет объекту изменять своё поведение в зависимости от своего состояния.
✅Стратегия (Strategy): определяет семейство алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость.
✅Шаблонный метод (Template Method): определяет скелет алгоритма в методе, перекладывая ответственность за некоторые его шаги на подклассы.
✅Посетитель (Visitor): позволяет добавлять в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.
Каждый паттерн проектирования решает определённую проблему и может быть применим в различных ситуациях в зависимости от особенностей проекта и требований к нему.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
В чём суть абстрактного класса ?
Спросят вероятностью 60%
Абстрактный класс и в ООП в целом — это специальный тип класса, который не может быть инстанциирован напрямую. Это означает, что вы не можете создать объект абстрактного класса используя оператор
new напрямую. Суть его заключается в том, чтобы служить основой для других классов, от которых будут создаваться объекты.
Используются для определения общего интерфейса и поведения для группы связанных классов. Они позволяют разработчикам определить методы, которые должны быть реализованы во всех наследующих классах, обеспечивая тем самым единообразие и согласованность. Кроме того, они могут содержать реализацию некоторых методов, которые будут наследоваться всеми производными классами, что уменьшает дублирование кода.
Пример:
abstract class ТранспортноеCредство {
protected $скорость;
public function установитьСкорость($скорость) {
$this->скорость = $скорость;
}
abstract public function двигаться();
}
class Автомобиль extends ТранспортноеCредство {
public function двигаться() {
echo "Движется на скорости: " . $this->скорость . " км/ч";
}
}
// $транспорт = new ТранспортноеCредство(); // Ошибка: не может быть инстанциирован
$автомобиль = new Автомобиль();
$автомобиль->установитьСкорость(60);
$автомобиль->двигаться();
В данном примере, этот класс ТранспортноеCредство определяет общее поведение и свойства для всех транспортных средств, такие как установитьСкорость, и требует от наследующих классов реализовать метод двигаться. Абстрактный метод двигаться должен быть реализован в каждом конкретном классе-наследнике, что гарантирует, что все транспортные средства будут иметь способность к движению, но способ реализации этой способности может отличаться в зависимости от типа транспортного средства.
Суть абстрактного класса, таким образом, заключается в определении шаблона (или общего поведения) для группы классов, обеспечивая при этом гибкость в реализации специфического поведения в каждом из производных классов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхЧем отличается абстрактный класс от интерфейса ?
Спросят с вероятностью 60%
Абстрактный класс и интерфейс - это два механизма, которые используются для достижения абстракции в ООП, но каждый из них играет свою роль и имеет свои особенности.
Абстрактный класс - не может быть инстанциирован (то есть, вы не можете создать объект этого класса напрямую). Он предназначен для того, чтобы служить базовым классом для других классов. Могут содержать как абстрактные методы (без реализации), так и методы с полной реализацией. Классы, наследующие его, должны реализовать все его абстрактные методы, но могут также переопределять реализованные методы.
Интерфейс представляет собой полностью абстрактный класс, который содержит только абстрактные методы (без реализации) и константы. Используются для определения набора методов, которые класс должен реализовать, не определяя при этом логику выполнения этих методов. Один класс может реализовывать множество интерфейсов, что позволяет обеспечить большую гибкость и множественное наследование.
Основные различия:
1️⃣Наследование vs. Реализация: Классы наследуют абстрактный класс (
extends), но реализуют интерфейс (implements).
2️⃣Методы и свойства: Абстрактные классы могут содержать как абстрактные, так и неабстрактные методы и свойства, в то время как интерфейсы могут содержать только абстрактные методы и константы.
3️⃣Множественное наследование: Класс не может наследовать более одного абстрактного класса, но может реализовывать множество интерфейсов.
4️⃣Конструкторы: Абстрактные классы могут иметь конструкторы, в то время как интерфейсы не могут.
Абстрактный класс:
abstract class Животное {
public function дышать() {
echo "Дышит воздухом";
}
abstract public function издаватьЗвук();
}
class Собака extends Животное {
public function издаватьЗвук() {
echo "Гав";
}
}
Интерфейс:
interface Передвигается {
public function двигаться();
}
class Человек implements Передвигается {
public function двигаться() {
echo "Ходит на двух ногах";
}
}
Абстрактный класс используется для определения общего поведения наследников, в то время как интерфейс определяет набор методов, которые должен реализовать класс. Абстрактный класс может быть использован для определения основы, а интерфейсы - для обеспечения гибкой архитектуры через множественное наследование.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых