PHP | Вопросы собесов
2.31K subscribers
34 photos
1 video
1.52K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 В чем ставится всегда цель теста?

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

🚩Основные цели

🟠Выявление ошибок и дефектов
Найти и исправить ошибки, которые могли возникнуть в ходе разработки. Это помогает предотвратить сбои в работе программы.

🟠Подтверждение соответствия требованиям
Убедиться, что программное обеспечение соответствует заданным требованиям и спецификациям. Это включает проверку функциональности, производительности, безопасности и других аспектов.

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

🟠Обеспечение пользовательского опыта
Убедиться, что конечные пользователи получат продукт, который удовлетворяет их потребности и ожидания, обеспечивая тем самым положительный пользовательский опыт.

🚩Типы

🟠Функциональное тестирование
Проверка того, что каждый компонент системы работает в соответствии с требованиями.
🟠Нефункциональное тестирование
Проверка аспектов, не связанных напрямую с функциональностью, таких как производительность, безопасность, удобство использования и т.д.
🟠Юнит-тестирование
Тестирование отдельных компонентов или модулей кода.
🟠Интеграционное тестирование
Проверка взаимодействия между различными модулями или компонентами системы.
🟠Системное тестирование
Полная проверка всей системы в целом.
🟠Приемочное тестирование
Проверка системы на соответствие бизнес-требованиям и готовность к использованию конечными пользователями.
use PHPUnit\Framework\TestCase;

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

class Calculator {
public function add($a, $b) {
return $a + $b;
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Реализация Fibonacci с рекурсией или без?

1. С рекурсией: проще написать, но требует больше памяти из-за вложенных вызовов.
2. Без рекурсии: итеративный метод или использование динамического программирования, эффективнее с точки зрения производительности.
3. Выбор зависит от задачи: рекурсия подходит для демонстрации, итерация — для практических целей.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое декремент?

декремент — это операция, используемые для увеличения или уменьшения значения переменной на единицу соответственно.

🚩Декремент


Оператор уменьшает значение переменной на единицу. Он представлен двумя минусами (--). Так же, как и инкремент, декремент бывает двух видов:

🟠Префиксный декремент (`--x`)
Сначала уменьшает значение переменной на единицу, затем возвращает новое значение.
🟠Постфиксный декремент (`x--`)
Возвращает текущее значение переменной, а затем уменьшает его на единицу.

<?php
$x = 10;
$y = 10;

// Пример префиксного инкремента
echo ++$x; // Выводит 11, x теперь равен 11

// Пример постфиксного инкремента
echo $y++; // Выводит 10, y теперь равен 11
echo $y; // Выводит 11

// Пример префиксного декремента
echo --$x; // Выводит 10, x теперь равен 10

// Пример постфиксного декремента
echo $y--; // Выводит 11, y теперь равен 10
echo $y; // Выводит 10
?>


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое Cookies?

Это небольшие файлы, которые хранят данные на стороне клиента (в браузере). Они используются для:
1. Идентификации пользователя и управления сессиями.
2. Сохранения предпочтений пользователя.
3. Отслеживания активности пользователя на сайте.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое нормализация, денормализация?

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

🚩Нормализация

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

🚩Цели нормализации

🟠Устранение дублирования данных
Это помогает экономить место и поддерживать согласованность данных.
🟠Повышение целостности данных
Например, если данные изменяются в одном месте, то изменения не нужно делать в других местах.

🚩Этапы нормализации

1⃣Первая нормальная форма (1NF)
Удаление повторяющихся групп и дублирующихся данных.
2⃣Вторая нормальная форма (2NF)
Устранение частичной зависимости данных от составного ключа.
3⃣Третья нормальная форма (3NF)
Устранение транзитивной зависимости (когда данные зависят не от первичного ключа напрямую, а через другие поля).
4⃣Далее
BCNF (нормальная форма Бойса-Кодда) и другие более сложные формы.

🚩Денормализация

Это процесс намеренного добавления избыточности данных для повышения производительности запросов.

🚩Цели денормализации

🟠Ускорение чтения данных
Объединение таблиц или добавление дублированных данных уменьшает количество соединений (JOIN) между таблицами.

SELECT o.OrderID, c.CustomerName, p.ProductName, p.ProductPrice
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN Products p ON o.ProductID = p.ProductID;


Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие структуры данных в программировании существуют?

Основные структуры:
- Линейные: массивы, списки, очереди, стеки.
- Нелинейные: деревья, графы.
- Ассоциативные: хеш-таблицы, словари.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем преимущество hash индекс и btree индекс?

Hash-индексы и B-Tree-индексы являются двумя типами индексов, используемыми для ускорения операций поиска в базах данных. Оба типа имеют свои преимущества и недостатки в зависимости от конкретных сценариев использования.

🚩Hash-индексы

➕Быстрый доступ по точному совпадению
Hash-индексы обеспечивают очень быстрый доступ к данным при выполнении точных поисков (например, SELECT * FROM table WHERE column = 'value'). Время поиска практически константное (O(1)), что делает такие запросы очень эффективными.
➕Простота реализации
Hash-индексы просты в реализации и не требуют сложных структур данных для управления.

🚩B-Tree-индексы

➕Поддержка диапазонных запросов
B-Tree-индексы поддерживают операции поиска по диапазону и сортировку (например, BETWEEN, >, <, ORDER BY). Данные в B-Tree отсортированы, что делает такие запросы возможными и эффективными.

➕Сбалансированность
B-Tree автоматически поддерживает балансировку, что обеспечивает стабильную производительность для всех операций (поиск, вставка, удаление).

➕Универсальность
B-Tree-индексы поддерживают широкий спектр операций и типов данных, включая текстовые данные, даты и числа.

🟠Hash-индекс
Подходит для сценариев, где часто выполняются точные запросы равенства, например, поиск пользователя по уникальному идентификатору или email.
CREATE INDEX idx_email_hash ON users USING HASH (email);

SELECT * FROM users WHERE email = 'example@example.com';


🟠B-Tree-индекс
Подходит для сценариев, где часто выполняются диапазонные запросы, сортировка или комбинированные условия.
CREATE INDEX idx_name_btree ON users (name);

SELECT * FROM users WHERE name BETWEEN 'A' AND 'M';


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что реализует класс DateTime?

1. Класс DateTime в PHP предоставляет объектно-ориентированный способ работы с датой и временем.
2. Он позволяет создавать, изменять, форматировать и сравнивать даты.
3. Также включает функционал для работы с временными зонами через класс DateTimeZone.
4. Упрощает работу с датами благодаря методам, таким как add(), sub(), и форматированию с помощью format().


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое полнотекстовый индекс?

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

🚩Зачем нужен полнотекстовый индекс?

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

🚩Как работает полнотекстовый индекс?

🟠Индексация
Когда создаётся полнотекстовый индекс, база данных анализирует текстовые данные, разбивает их на слова (токены) и сохраняет их в особой структуре индекса.
🟠Поиск
При выполнении запроса база данных ищет совпадения среди токенов в индексе, а не в самом тексте.
🟠Релевантность
Полнотекстовый индекс учитывает частоту появления слов и их позицию, чтобы выдавать результаты, наиболее соответствующие запросу.

🚩Использование полнотекстового индекса в MySQL

🟠Создание полнотекстового индекса
Полнотекстовый индекс можно создавать для столбцов типа CHAR, VARCHAR, или TEXT.
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT(title, content)
);


🟠Поиск с использованием полнотекстового индекса
Для выполнения полнотекстового поиска используется оператор MATCH ... AGAINST.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('PHP tutorial');


🟠Модели поиска
Natural Language Mode: Поиск слов и фраз с учётом их важности.
Boolean Mode: Позволяет использовать логические операторы (например, + для обязательных слов, - для исключаемых).
Query Expansion: Автоматически расширяет запрос с помощью синонимов или связанных слов.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('+PHP -Java' IN BOOLEAN MODE);


🚩Ограничения полнотекстового индекса

🟠Минимальная длина слова
По умолчанию слова короче 3 символов игнорируются (это настраивается).
🟠Стоп-слова
Некоторые часто встречающиеся слова (например, "and", "the") исключаются из индексации.
🟠Чувствительность к языку
Важно учитывать настройки языка для анализа текста.
🟠Поддержка типов данных
Полнотекстовые индексы доступны только для текстовых полей.

🚩Плюсы

➕Быстрый поиск по большим объемам текста.
➕Удобная работа с нерелевантными данными (например, похожими словами).
➕Возможность вычисления ранжирования (релевантности) результатов.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что изменилось в приведении типов в PHP 8?

PHP 8 усилил строгую типизацию, добавив поддержку объединённых типов (Union Types). Также введены типы mixed и static, расширяющие возможности определения данных. Улучшена работа с привидением типов, исключая двусмысленности, чтобы снизить вероятность ошибок.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 По какому принципу бы старались разделять модули, если находились бы не на уровне классов, а выше?

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
🔥1
🤔 Что запрещает final?

Модификатор final запрещает наследование класса, если он указан перед его объявлением.
Если final используется для метода, он запрещает переопределение этого метода в дочерних классах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Расскажи про фабрики

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

🚩Зачем нужны фабрики?

🟠Инкапсуляция процесса создания объектов
Если создание объекта требует сложной логики или конфигурации, фабрика позволяет скрыть эту сложность от остальной части кода.

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

🟠Гибкость и расширяемость
Фабрики позволяют добавлять новые классы без изменения существующего кода.

🚩Типы фабрик

🟠Простая фабрика (Simple Factory)
Это метод, который возвращает объект одного из нескольких возможных классов в зависимости от переданных параметров.

   class ShapeFactory {
public static function createShape(string $type) {
return match ($type) {
'circle' => new Circle(),
'square' => new Square(),
default => throw new Exception("Unknown shape type"),
};
}
}

$circle = ShapeFactory::createShape('circle'); // Возвращает объект Circle


🟠Фабричный метод (Factory Method)
В этом шаблоне создание объекта делегируется подклассам. Основной класс определяет интерфейс для создания объектов, но сам не знает, какие конкретные классы будут созданы.

   interface Logger {
public function log(string $message);
}

class FileLogger implements Logger {
public function log(string $message) {
echo "Logging to a file: $message";
}
}

class DatabaseLogger implements Logger {
public function log(string $message) {
echo "Logging to a database: $message";
}
}

abstract class LoggerFactory {
abstract public function createLogger(): Logger;
}

class FileLoggerFactory extends LoggerFactory {
public function createLogger(): Logger {
return new FileLogger();
}
}

$factory = new FileLoggerFactory();
$logger = $factory->createLogger();
$logger->log("Hello World");


🟠Абстрактная фабрика (Abstract Factory)
Этот шаблон используется для создания семейств взаимосвязанных объектов.

   interface GUIFactory {
public function createButton(): Button;
public function createCheckbox(): Checkbox;
}

class WindowsFactory implements GUIFactory {
public function createButton(): Button {
return new WindowsButton();
}
public function createCheckbox(): Checkbox {
return new WindowsCheckbox();
}
}

class MacOSFactory implements GUIFactory {
public function createButton(): Button {
return new MacOSButton();
}
public function createCheckbox(): Checkbox {
return new MacOSCheckbox();
}
}

$factory = new WindowsFactory();
$button = $factory->createButton();
$checkbox = $factory->createCheckbox();


🚩Как использовать фабрики?

Если вы работаете с приложением, где объекты часто меняются, например, в зависимости от окружения (Windows, MacOS).
Когда создание объектов сложное и требует дополнительной логики.
Когда нужно уменьшить зависимость между модулями.

Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое индекс?

Индекс в контексте баз данных — это структура данных, которая улучшает скорость операций поиска/выборки данных, но может замедлить добавление, удаление и обновление данных из-за необходимости поддерживать индекс в актуальном состоянии.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Какие есть виды join?

JOIN – это операция в SQL, которая позволяет объединять данные из двух или более таблиц на основе общего поля.

В SQL есть 5 основных видов JOIN

🟠`INNER JOIN`
пересечение двух таблиц (только совпадающие записи).
🟠`LEFT JOIN`
все записи из левой таблицы + совпадения из правой.
🟠`RIGHT JOIN`
все записи из правой таблицы + совпадения из левой.
🟠`FULL JOIN`
объединяет все записи из обеих таблиц.
🟠`CROSS JOIN`
декартово произведение (каждая строка первой таблицы соединяется с каждой строкой второй).

🚩`INNER JOIN` – только совпадения

Возвращает только те строки, у которых есть совпадения в обеих таблицах.
SELECT users.id, users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;


🚩`LEFT JOIN` – все из левой таблицы + совпадения

Возвращает все записи из левой таблицы, а если в правой нет совпадения – подставляет NULL.
SELECT users.id, users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что известно про фабрики?

Это порождающий паттерн, создающий объекты без явного указания их класса.
1. Simple Factory: один метод создаёт разные объекты.
2. Factory Method: делегирует создание объектов подклассам.
3. Abstract Factory: создаёт семейства связанных объектов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какой синтаксис у заголовков?

Заголовки в языках и разметки часто используются для указания ключевой информации, на которую стоит обратить внимание, и они различаются в зависимости от конкретного контекста и языка. Ниже приведены примеры синтаксиса заголовков в различных контекстах:

🚩Заголовки в HTML

Поддерживает шесть уровней заголовков, от <h1> до <h6>, где <h1> представляет самый важный заголовок, а <h6> — наименее важный.
<h1>Заголовок уровня 1</h1>
<h2>Заголовок уровня 2</h2>
<h3>Заголовок уровня 3</h3>
<h4>Заголовок уровня 4</h4>
<h5>Заголовок уровня 5</h5>
<h6>Заголовок уровня 6</h6>


🚩Заголовки в Markdown

Это язык разметки, который упрощает форматирование текста, особенно для написания документации. Заголовки создаются с помощью символа # перед текстом заголовка. Количество символов # определяет уровень заголовка.
# Заголовок уровня 1
## Заголовок уровня 2
### Заголовок уровня 3
#### Заголовок уровня 4
##### Заголовок уровня 5
###### Заголовок уровня 6


🚩Заголовки в LaTeX

Это система подготовки документов, широко используемая для научных и технических документов. В LaTeX заголовки создаются с помощью команд \section, \subsection, \subsubsection и так далее.
\section{Заголовок уровня 1}
\subsection{Заголовок уровня 2}
\subsubsection{Заголовок уровня 3}
\paragraph{Заголовок уровня 4}
\subparagraph{Заголовок уровня 5}


🚩Заголовки в Языке разметки Wiki

Многие вики-движки (например, MediaWiki) используют свои синтаксисы для создания заголовков. В MediaWiki заголовки создаются с помощью равно (=) вокруг текста заголовка.
= Заголовок уровня 1 =
== Заголовок уровня 2 ==
=== Заголовок уровня 3 ===
==== Заголовок уровня 4 ====
===== Заголовок уровня 5 =====
====== Заголовок уровня 6 ======


🚩Заголовки в языках

Часто не используются так же, как в разметке, но комментарии могут выполнять схожую роль для организации и документирования кода. Примеры синтаксиса для комментариев-заголовков:

Python
# Заголовок уровня 1
## Заголовок уровня 2
### Заголовок уровня 3


JavaScript
// Заголовок уровня 1
// =================
// Заголовок уровня 2
// -----------------
// Заголовок уровня 3
// ~~~~~~~~~~~~~~~~~


Ставь 👍 и забирай 📚 Базу знаний
💊1
🤔 Принципы ООП

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое стрелочные и анонимные функции?

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

🚩Анонимные функции


Это функции без имени, которые часто используются для создания функций-замыканий. Замыкания позволяют функциям захватывать переменные из своей области видимости. Анонимные функции создаются с использованием ключевого слова function.
<?php
$sayHello = function($name) {
return "Привет, $name!";
};

echo $sayHello("Мир"); // Выведет: Привет, Мир!
?>


🚩Стрелочные функции

Были введены в PHP 7.4 и представляют собой более компактный способ создания анонимных функций. Они используют синтаксис fn и автоматически захватывают переменные из внешней области видимости по значению.
<?php
$factor = 10;

$multiply = fn($x) => $x * $factor;

echo $multiply(5); // Выведет: 50
?>


🚩Зачем это нужно?

🟠Удобство
Создание функций на месте без необходимости придумывать имена.
🟠Замыкания
Возможность захвата переменных из внешней области видимости.
🟠Читабельность кода
Стрелочные функции делают код более лаконичным и читаемым.

🚩Как это используется?

🟠Фильтрация и сортировка массивов
Часто используются в функциях вроде array_filter, array_map и usort.
🟠Колбэки
Передача функции в качестве аргумента в другие функции (например, для обработки событий).

<?php
$numbers = [1, 2, 3, 4, 5];

$squared = array_map(fn($n) => $n * $n, $numbers);

print_r($squared); // Выведет: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
?>


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое инкапсуляция?

Инкапсуляция — это принцип ООП, при котором детали реализации скрыты от внешнего мира, предоставляя доступ к данным через методы. В PHP это реализуется с помощью модификаторов доступа (private, protected, public). Она обеспечивает безопасность данных и облегчает поддержку кода.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чём суть абстрактного класса?

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

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

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

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

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

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


Ставь 👍 и забирай 📚 Базу знаний