PHP | Вопросы собесов
Открыть в Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Больше2 341
Подписчики
-124 часа
-47 дней
-2430 день
Архив постов
🤔 Как посчитать функцию если внутри неё много различных действий?
Сложность функции можно оценить с помощью Big O (O-нотация) – это способ понять, как увеличивается время работы функции при росте входных данных.
🚩Определение сложности по Big O
Константные операции (
+, -, *, /, if, return) считаются за O(1).
Циклы (for, while) увеличивают сложность** (например, for на N итераций → O(N)).
Вложенные циклы (for внутри for) дают O(N²).
Рекурсия учитывается как глубина рекурсии.
🚩Примеры расчёта сложности
Простая функция (O(1)) – не зависит от входных данных
function addNumbers($a, $b) {
return $a + $b;
}
Линейная сложность O(N) (цикл)
function printNumbers($n) {
for ($i = 0; $i < $n; $i++) {
echo $i;
}
}
Квадратичная сложность O(N²) (вложенные циклы)
function printPairs($n) {
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $n; $j++) {
echo "($i, $j) ";
}
}
}
Логарифмическая сложность O(log N) (деление пополам, бинарный поиск)
function binarySearch($arr, $target) {
$left = 0;
$right = count($arr) - 1;
while ($left <= $right) {
$mid = floor(($left + $right) / 2);
if ($arr[$mid] == $target) {
return $mid;
} elseif ($arr[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
return -1;
}
Факториальная сложность O(N!) (перебор всех вариантов)
function factorial($n) {
if ($n == 1) return 1;
return $n * factorial($n - 1);
}
🚩Как считать сложность функции с разными действиями?
Если в функции разные действия, считаем их отдельно и берём наибольшую сложность.
function complexFunction($n) {
// O(1)
$sum = 0;
// O(N)
for ($i = 0; $i < $n; $i++) {
$sum += $i;
}
// O(N²)
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $n; $j++) {
echo "Hello";
}
}
return $sum;
}
Ставь 👍 и забирай 📚 Базу знанийИщу желающих заполнять карточки товаров на ВБ!
Работа полностью на удаленке с зп до150 000 рублей в месяц.
Без опыта, нужен только телефон, занятость 3-6 часов в день.
Всему обучат на бесплатном курсе и после возьму на работу:
✅ 3 дня уроков по 30 минут
✅ Домашки с проверкой и оплатой бонусами
✅ Плачу 10 тыс за каждую выполненную домашку
Все кто пройдет курс, получат сертификат от школы с образовательной лицензией.
⚡ Набор заканчивается завтра.
👍 Для регистрации жмите кнопку "Зарегистрироваться"
Зарегистрироваться
#реклама 16+
course.wildmanager.ru
О рекламодателе
🤔 Что реализует класс DateTime?
1. Класс DateTime в PHP предоставляет объектно-ориентированный способ работы с датой и временем.
2. Он позволяет создавать, изменять, форматировать и сравнивать даты.
3. Также включает функционал для работы с временными зонами через класс DateTimeZone.
4. Упрощает работу с датами благодаря методам, таким как add(), sub(), и форматированию с помощью format().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем преимущества асинхронного шифрования?
Асинхронное шифрование (асимметричная криптография) использует пару ключей:
Открытый (public key) – используется для шифрования данных.
Закрытый (private key) – используется для расшифровки данных.
Этот метод отличается от симметричного шифрования, где один и тот же ключ используется и для шифрования, и для дешифровки.
🟠Безопасный обмен ключами
- В симметричном шифровании нужно передать секретный ключ, что создаёт риск его перехвата.
- В асимметричном шифровании передаётся только открытый ключ, а закрытый ключ никогда не покидает владельца.
🟠Цифровая подпись – гарантия подлинности данных
- Можно подписывать данные закрытым ключом, а затем любой человек может проверить их подлинность с помощью открытого ключа.
$data = "Важное сообщение";
$privateKey = openssl_pkey_get_private(file_get_contents("private.pem"));
$publicKey = openssl_pkey_get_public(file_get_contents("public.pem"));
// Создаём подпись
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
// Проверяем подпись
$valid = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
echo $valid ? "Подпись верна" : "Подпись недействительна";
🟠Возможность шифрования без предварительного контакта
- В симметричном шифровании обе стороны должны сначала договориться о ключе.
- В асимметричном шифровании можно просто использовать открытый ключ получателя без предварительного обмена секретами.
🟠Используется в SSL/TLS для безопасного соединения
- Когда вы заходите на сайт с https://, браузер использует асимметричное шифрование для установки защищённого соединения с сервером.
- После этого браузер и сервер могут использовать симметричное шифрование (быстрее), но начальный обмен ключами происходит безопасно.
🚩Как это работает?
1. Браузер запрашивает у сервера его открытый ключ.
2. Шифрует случайный симметричный ключ и отправляет его серверу.
3. Сервер расшифровывает его закрытым ключом и использует для дальнейшей защиты соединения.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое DI Container?
Это инструмент для управления зависимостями приложения.
• Он автоматически создаёт объекты и предоставляет их другим компонентам, решая, какие зависимости инъектировать.
• Контейнер упрощает реализацию DI, улучшает модульность и тестируемость приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какой принцип из SOLID позволяет соблюдать добавочные преобразования в работе?
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP), который является одной из пяти основных концепций SOLID — набора принципов объектно-ориентированного дизайна, предназначенных для создания более понятного, гибкого и поддерживаемого программного обеспечения.
🚩Принцип подстановки Барбары Лисков (LSP)
Утверждает, что объекты класса-наследника должны быть способны заменить объекты класса-предка, не нарушая корректность работы программы. Этот принцип расширяет идею подтипов, предполагая, что подклассы должны быть взаимозаменяемы с их базовыми классами.
🚩Основные аспекты
🟠Взаимозаменяемость
объекты подкласса можно использовать вместо объектов их суперкласса без изменения желаемого результата работы программы.
🟠Сохранение поведения
подклассы не должны изменять поведение, заданное их базовыми классами, особенно те аспекты, которые клиенты класса ожидают.
class Vehicle {
protected $speed = 0;
public function accelerate($increase) {
$this->speed += $increase;
return $this->speed;
}
}
class Car extends Vehicle {
public function accelerate($increase) {
$this->speed += $increase * 2; // Ускоряемся быстрее, но логика сохраняется
return $this->speed;
}
}
class Bicycle extends Vehicle {
public function accelerate($increase) {
$this->speed += $increase / 2; // Ускоряемся медленнее, но логика сохраняется
return $this->speed;
}
}
Ставь 👍 и забирай 📚 Базу знаний🤔 Имеет ли значение регистр заголовка?
Нет, не имеет.
В HTTP заголовки регистронезависимы.
Например, Content-Type, content-type, CONTENT-TYPE — это одно и то же.
Но значения заголовков могут быть чувствительны к регистру — зависит от конкретного поля.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что будет если мы цифру 3 int сложим плюсом со строкой 4 что будет?
Если в PHP выполнить операцию сложения (
+) числа 3 (int) и строки "4" (string), то PHP автоматически приведёт строку "4" к числу, и произойдёт арифметическая операция:
$result = 3 + "4";
echo $result; // 7
🚩Как это работает?
PHP видит, что используется оператор +, который применяется только к числам.
"4" — это строка, но она содержит только число, поэтому PHP автоматически преобразует её в int.
Затем выполняется операция 3 + 4, и результатом будет 7.
🚩Что если строка не является числом?
Если строка не является корректным числом, PHP попробует взять из неё число с начала строки. Если в начале строки нет цифр, то строка будет воспринята как 0.
Примеры странных случаев
echo 3 + "4abc"; // 7 (строка "4abc" преобразуется в число 4)
echo 3 + "abc4"; // 3 (строка "abc4" преобразуется в 0, т.к. начинается не с цифры)
echo 3 + "0.5"; // 3.5 (строка "0.5" преобразуется в число 0.5)
echo 3 + " "; // 3 (пробелы преобразуются в 0)
🚩Что если использовать `.` вместо `+`?
Если вместо + использовать . (конкатенацию строк), то числа не складываются, а просто соединяются как строки
echo 3 . "4"; // "34" (строка)
Ставь 👍 и забирай 📚 Базу знаний🤔 Какими способами организовать порции?
Разделение данных на порции (batch processing) может быть организовано разными методами:
1. LIMIT и OFFSET – классический способ для пагинации в SQL.
2. Cursor-based pagination – используется в API, позволяет получать новые данные без смещения.
3. Частичная загрузка данных – загружать данные по мере необходимости (lazy loading).
4. Очереди (Message Queues) – например, RabbitMQ или Kafka для обработки данных в потоках.
5. Шардирование данных – разделение больших таблиц на более мелкие логические части.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое ключи в БД?
Это специальные поля или комбинации полей, которые используются для идентификации записей и установления связей между таблицами. Ключи играют важную роль в обеспечении целостности и эффективности базы данных.
🚩Виды ключей
🟠Первичный ключ (Primary Key)
Это одно или несколько полей, которые однозначно идентифицируют каждую запись в таблице. Он должен быть уникальным и не содержать NULL-значений.
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
🟠Внешний ключ (Foreign Key)
Это поле или набор полей в одной таблице, которое указывает на первичный ключ в другой таблице. Внешние ключи используются для установления и обеспечения целостности ссылок между таблицами.
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
🟠Кандидатный ключ (Candidate Key)
Это поле или комбинация полей, которое может служить уникальным идентификатором для записи в таблице. Таблица может иметь несколько кандидатных ключей, из которых один выбирается как первичный ключ.
CREATE TABLE users (
user_id INT,
email VARCHAR(100),
phone VARCHAR(20),
PRIMARY KEY (user_id),
UNIQUE (email),
UNIQUE (phone)
);
🟠Альтернативный ключ (Alternate Key)
Это любой кандидатный ключ, который не выбран в качестве первичного ключа. В примере выше email и phone являются альтернативными ключами, так как user_id выбран как первичный ключ.
🟠Составной ключ (Composite Key)
Это ключ, состоящий из двух или более полей, которые вместе уникально идентифицируют запись.
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
🟠Суррогатный ключ (Surrogate Key)
Это искусственно созданный ключ, который обычно представляет собой уникальный идентификатор, не имеющий смысла вне контекста базы данных.
CREATE TABLE employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(100)
);
Ставь 👍 и забирай 📚 Базу знаний🤔 Какие есть виды JOIN?
Основные типы JOIN в SQL:
- INNER JOIN — только совпадающие записи.
- LEFT JOIN — все из левой таблицы + совпадающие из правой.
- RIGHT JOIN — все из правой таблицы + совпадающие из левой.
- FULL OUTER JOIN — все записи из обеих таблиц, где есть совпадения или NULL.
- CROSS JOIN — декартово произведение (все комбинации).
- SELF JOIN — соединение таблицы с самой собой.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое замыкание?
Это функция вместе с окружением, в котором она была создана. Замыкание позволяет функции "запомнить" переменные из внешнего контекста, даже после того, как этот контекст завершил свое выполнение. Это делает замыкания мощным инструментом для создания функций, которые могут работать с данными, доступными во время их создания.
🚩Основные особенности замыканий
🟠Доступ к внешним переменным
Функция может использовать переменные из внешнего контекста, в котором она была создана.
🟠Сохранение состояния
Замыкания могут сохранять состояние между вызовами.
🟠Инкапсуляция
Замыкания могут использоваться для создания частных данных и методов.
🚩Примеры замыканий в различных языках программирования
🟠JavaScript
В JavaScript замыкания используются очень часто. Рассмотрим простой пример:
function createCounter() {
let count = 0; // внешняя переменная
return function() { // внутренная функция
count++;
return count;
}
}
const counter = createCounter(); // создаем замыкание
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
🟠Python
В Python замыкания также поддерживаются:
def create_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = create_counter()
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3
🟠PHP
В PHP замыкания реализуются через анонимные функции и использование use:
function createCounter() {
$count = 0;
return function() use (&$count) {
$count++;
return $count;
};
}
$counter = createCounter();
echo $counter(); // 1
echo $counter(); // 2
echo $counter(); // 3
🚩Применение замыканий
🟠Создание фабричных функций
Замыкания могут использоваться для создания фабричных функций, которые генерируют другие функции с определенным поведением.
🟠Инкапсуляция
Замыкания позволяют скрывать переменные и методы внутри функции, предоставляя интерфейс для взаимодействия с ними.
🟠Обработка событий
В языках, таких как JavaScript, замыкания часто используются в обработчиках событий для доступа к контексту, в котором был назначен обработчик.
🟠Мемоизация
Замыкания могут использоваться для создания функций, которые запоминают результаты предыдущих вычислений и используют их для ускорения последующих вызовов.
Ставь 👍 и забирай 📚 Базу знаний🤔 Зачем нужен шаблон Builder?
Шаблон Builder (Строитель) применяется для поэтапного создания сложных объектов. Он нужен, когда:
- Объект имеет много параметров, инициализация которых может быть сложной.
- Объект должен создаваться в разных конфигурациях, не загромождая конструктор.
- Код становится более читаемым, так как отделяется процесс создания от структуры объекта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое Rest?
Это архитектурный стиль для создания веб-сервисов, который был предложен Роем Филдингом в его докторской диссертации в 2000 году. В его основе лежит принцип использования стандартных HTTP методов (GET, POST, PUT, DELETE и др.) для взаимодействия с ресурсами, представленными в виде URL.
🚩Основные принципы
🟠Адресуемость (Addressability)
Каждому ресурсу (например, пользователю, товару) соответствует уникальный URL.
🟠Использование стандартных методов HTTP
Использует методы HTTP для выполнения операций с ресурсами.
GET: Получение данных.
POST: Создание нового ресурса.
PUT: Обновление существующего ресурса.
DELETE: Удаление ресурса.
🟠Статусность (Statelessness)
Каждый запрос к серверу должен содержать всю необходимую информацию для его обработки. Сервер не хранит информацию о состоянии клиента между запросами.
🟠Кэширование (Caching)
Ответы от сервера могут кэшироваться, чтобы улучшить производительность и снизить нагрузку на сервер.
🟠Единообразие интерфейса (Uniform Interface)
Все взаимодействия между клиентом и сервером стандартизированы, что упрощает интеграцию и взаимодействие между системами.
🚩Примеры
🟠Получение списка пользователей (GET)
Запрос
GET /usersОтвет
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
🟠Получение информации о конкретном пользователе (GET)
Запрос
GET /users/1Ответ
{
"id": 1,
"name": "Alice"
}
🟠Создание нового пользователя (POST)
Запрос
POST /users
Content-Type: application/json
{
"name": "Charlie"
}
Ответ (Успешное создание)
{
"id": 3,
"name": "Charlie"
}
🟠Обновление информации о пользователе (PUT)
Запрос
PUT /users/1
Content-Type: application/json
{
"name": "Alice Updated"
}
Ответ
{
"id": 1,
"name": "Alice Updated"
}
🟠Удаление пользователя (DELETE)
Запрос
DELETE /users/1
Ответ (Успешное удаление)
{
"message": "User deleted"
}
Ставь 👍 и забирай 📚 Базу знаний🤔 Что известно про букву D в SOLID и её связь с интерфейсами?
D означает Dependency Inversion Principle — принцип инверсии зависимостей.
1. Модули верхнего уровня не должны зависеть от модулей нижнего уровня, оба должны зависеть от абстракций.
2. В коде это реализуется через интерфейсы: классы работают с интерфейсами, а не с конкретными реализациями.
3. Это упрощает тестирование и замену модулей без изменения основного кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Расскажи про фабрики
Это шаблон проектирования, который относится к порождающим шаблонам и используется для создания объектов без необходимости указывать точный класс создаваемого объекта. Основная идея фабрики заключается в том, чтобы делегировать создание объектов специальному классу или методу, что упрощает управление кодом и позволяет добиться большей гибкости и расширяемости.
🚩Зачем нужны фабрики?
🟠Инкапсуляция процесса создания объектов
Если создание объекта требует сложной логики или конфигурации, фабрика позволяет скрыть эту сложность от остальной части кода.
🟠Снижение зависимости от конкретных классов
Вы используете интерфейсы или абстрактные классы вместо конкретных реализаций. Это упрощает замену одного типа объекта на другой.
🟠Гибкость и расширяемость
Фабрики позволяют добавлять новые классы без изменения существующего кода.
🚩Типы фабрик
🟠Простая фабрика (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).
Когда создание объектов сложное и требует дополнительной логики.
Когда нужно уменьшить зависимость между модулями.
Ставь 👍 и забирай 📚 Базу знаний🤔 Как устроен Git?
Это распределенная система контроля версий (VCS), которая позволяет отслеживать изменения в коде, работать в командах и управлять версиями проекта.
Основные компоненты:
1. Рабочая директория (Working Directory) – файлы, с которыми работает разработчик.
2. Index (Staging Area) – подготовленная зона перед коммитом.
3. Локальный репозиторий (Local Repository) – база данных версий на локальном устройстве.
4. Удаленный репозиторий (Remote Repository) – центральное хранилище проекта (GitHub, GitLab, Bitbucket).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что считается хорошо написанным Task`ом?
Хорошо написанный Task (задача) должен быть понятным, конкретным и выполнимым. Если задача написана размыто, разработчик потратит больше времени на уточнение деталей, а не на саму работу.
🚩Основные принципы хорошего Task'а
🟠Чёткое и понятное название
Плохо:
Исправить баг (какой баг? где?)
Хорошо: Исправить ошибку расчёта скидки при оформлении заказа
🟠Описание должно отвечать на 3 вопроса:
Что нужно сделать? (конкретные действия)
Зачем это нужно? (какая проблема решается)
Как это проверить? (критерии выполнения)
🟠Минимум абстракции, максимум конкретики
Плохо: Добавить авторизацию на сайт
Хорошо: Добавить авторизацию через Google OAuth 2.0 для пользователей, чтобы они могли входить через Google-аккаунт
🟠Разбивать задачи на подзадачи (если задача сложная)
Например, если задача "Реализовать корзину покупок", то лучше разбить её на:
Добавление товаров в корзину
Расчёт итоговой суммы
Удаление товаров из корзины
Оформление заказа
🟠Указывать требования (технические детали, ссылки, макеты, API, форматы данных)
Если задача связана с API → указываем эндпоинты. Если UI → прикладываем макеты (Figma, Zeplin). Если есть примеры → добавляем скриншоты.
🟠Добавлять критерии выполнения (Definition of Done, DoD)
Плохо: Сделать фильтр по цене
Хорошо: Фильтр по цене должен работать в диапазоне от 0 до 100 000, быть интерактивным (ползунок), без перезагрузки страницы.
Ставь 👍 и забирай 📚 Базу знаний+1
Вебинар - "Оптимизация маркетинга с помощью нейросетей!"
Хватит «гореть» на рутине! ⚡
Узнайте на бесплатном вебинаре, как ИИ сократит вашу рутинную работу на 80%.
📅 10 сентября | 19:00 (МСК)
Вы получите практические инструкции, как:
- Автоматизировать контент и анализ аудитории
- Генерировать креативные идеи за секунды
- Создать своего AI-аватара без программирования
Для маркетологов, SMM- и контент-специалистов.
💰 Подарок после регистрации: «Гид по созданию цифрового аватара».
Превратите ИИ в вашего неутомимого помощника!
Зарегистрироваться
#реклама 16+
ed.bonnieandslide.com
О рекламодателе
🤔 Чем отличается BacktimeTable от Backtime?
1. BacktimeTable может быть структурой данных или таблицей, используемой для хранения промежуточных результатов в задаче обратного отсчёта или обработки данных.
2. Backtime часто означает сам процесс обратного отсчёта или времени ожидания.
3. Различие зависит от контекста: таблица — для хранения, backtime — для логики.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
