PHP | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
نمایش بیشتر2 343
مشترکین
-324 ساعت
-77 روز
-2830 روز
آرشیو پست ها
🤔 Как типы связи реализуются в Laravel?
Laravel Eloquent поддерживает следующие связи:
- One-to-One — через hasOne / belongsTo.
- One-to-Many — через hasMany / belongsTo.
- Many-to-Many — через belongsToMany и pivot-таблицы.
- Has One Through / Has Many Through — для косвенных связей.
- Polymorphic — одна модель может принадлежать разным другим моделям (например, Comment может быть к Post или Video).
- Morph To Many — полиморфные связи с множеством объектов.
Все связи описываются как методы модели и могут использоваться для ленивой или жадной загрузки (lazy/eager loading).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Где вести задачи и проекты? Конечно, в Битрикс24
Бесплатный онлайн-сервис для бизнеса и совместной работы. Полный комплект для эффективности вашей команды.
Ставьте первую задачу прямо сейчас
Начать
#реклама 16+
task-24.bitrix24.ru
О рекламодателе
🤔 Что если в классе есть публичное свойство, это означает что класс иммутабельный или нет?
Нет, наличие публичного свойства в классе не делает его автоматически иммутабельным.
🚩Что такое иммутабельность
Означает, что состояние объекта не может измениться после его создания. Все изменения создают новый объект, вместо изменения состояния существующего объекта.
🚩Публичные свойства и иммутабельность
Означает, что его можно изменить из любого места, где доступен экземпляр класса. Таким образом, если у класса есть публичное свойство, этот класс не может считаться иммутабельным, поскольку его состояние можно изменять напрямую.
🚩Пример неиммутабельного класса
В этом примере свойство
name публичное, и его значение может быть изменено после создания объекта, что нарушает иммутабельность.
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$person = new Person("John");
$person->name = "Doe"; // Состояние объекта изменено
🚩Иммутабельный класс
Для создания иммутабельного класса свойства должны быть приватными или защищёнными, и изменение этих свойств должно быть невозможным после создания объекта.
class ImmutablePerson {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$person = new ImmutablePerson("John");
// $person->name = "Doe"; // Это вызовет ошибку, т.к. свойство приватное
echo $person->getName(); // Выведет: John
Ставь 👍 и забирай 📚 Базу знанийВ турагентство на удаленку требуются стажеры
Клиентов предоставим. Можно без опыта и совмещая с основной работой или декретом.
С нас обучение с гарантированной стажировкой.
Доход после обучения:
от 50 000₽ до 220 000₽. Оплата в процессе обучения зависит от вашей вовлеченности.
Задачи:
Помогать людям организовывать путешествия:
подбор самых выгодных предложений на отдых со скидкой до 50% в новых сервисах бронирования.
Условия:
✅ Без опыта — обучение с нуля за 2 месяца, первые выплаты в среднем в течение 2 недель;
✅Удаленная работа или совмещение с офисом (по желанию, зависит от вашего города).
Хотите проверить, подойдет ли это вам? Регистрируйтесь на бесплатный вводный урок, на котором узнаете:
— как подбирать туры для себя и близких с выгодой до 40%
— как получать комиссию 7-10% с каждого тура.
Узнать больше
#реклама 16+
via-tourism-school.space
О рекламодателе
🤔 В чем различие между where и having?
WHERE используется для фильтрации строк до применения агрегатных функций и группировки данных, тогда как HAVING применяется после группировки для фильтрации результатов агрегатных функций. WHERE работает с отдельными записями, а HAVING — с агрегированными группами. Оба оператора часто применяются вместе для многоуровневой фильтрации данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое сервис локатор?
Это паттерн проектирования, который используется для абстрагирования процесса поиска и предоставления зависимостей объектам. Вместо того чтобы объекты сами создавали свои зависимости или получали их через конструкторы, они запрашивают их у специального объекта – локатора сервисов.
🚩Зачем нужен
🟠Упрощение управления зависимостями
Все зависимости находятся в одном месте, что упрощает их управление и замену.
🟠Гибкость
Легко менять конкретные реализации зависимостей без изменения клиентского кода.
🟠Централизация
Все зависимости зарегистрированы и управляются в одном месте.
🟠Улучшение тестирования
Легко подменять зависимости на моки для проведения тестов.
🚩Как используется
Паттерн Service Locator может быть реализован через создание централизованного реестра, который хранит информацию о различных сервисах и предоставляет их по запросу.
1⃣Создание интерфейсов сервисов
interface Logger {
public function log($message);
}
interface PaymentProcessor {
public function processPayment($amount);
}
2⃣Реализация сервисов
class FileLogger implements Logger {
public function log($message) {
echo "Logging message to a file: $message";
}
}
class StripePaymentProcessor implements PaymentProcessor {
public function processPayment($amount) {
echo "Processing payment of $amount through Stripe";
}
}
3⃣Реализация Service Locator
class ServiceLocator {
private $services = [];
public function register($serviceName, $service) {
$this->services[$serviceName] = $service;
}
public function get($serviceName) {
if (!isset($this->services[$serviceName])) {
throw new Exception("Service not found: " . $serviceName);
}
return $this->services[$serviceName];
}
}
4⃣Регистрация и использование сервисов
$serviceLocator = new ServiceLocator();
// Регистрация сервисов
$serviceLocator->register('logger', new FileLogger());
$serviceLocator->register('paymentProcessor', new StripePaymentProcessor());
// Использование сервисов
$logger = $serviceLocator->get('logger');
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.
$paymentProcessor = $serviceLocator->get('paymentProcessor');
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe
🚩Плюсы и минусы
➕Централизация
Все зависимости хранятся и управляются в одном месте.
➕Гибкость
Легко изменять зависимости без изменения кода, который их использует.
➕Удобство тестирования
Легко подменять реальные зависимости на моки для тестирования.
➖Скрытые зависимости
Зависимости не видны явно в коде, что может усложнить понимание.
➖Сложность
Может привести к более сложной архитектуре, особенно в больших приложениях.
Ставь 👍 и забирай 📚 Базу знаний🤔 Зачем нужны паттерны проектирования?
Паттерны проектирования решают типичные задачи разработки, предоставляя проверенные временем решения. Они повышают читаемость, повторное использование и масштабируемость кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
📺 Уникальная база IT собеседований
456+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы.
Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.
🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
🤔 Что такое списочный тип?
Списочный тип данных, также известный как список, представляет собой структуру данных, которая хранит упорядоченные коллекции элементов. Списки позволяют хранить наборы элементов, доступ к которым можно получить по индексу. Они широко используются в программировании благодаря своей гибкости и удобству.
🚩Особенности
🟠Упорядоченность
Элементы в списке хранятся в определенном порядке, и этот порядок сохраняется. Каждый элемент имеет индекс, по которому к нему можно обратиться.
🟠Изменяемость
Списки обычно являются изменяемыми структурами данных, что означает, что вы можете добавлять, удалять или изменять элементы после создания списка.
🟠Гетерогенность
В списке могут храниться элементы различных типов данных (например, числа, строки, объекты).
🚩Примеры списочных типов в различных языках программирования
Python
my_list = [1, 2, 3, 'a', 'b', 'c']
my_list.append(4) # Добавление элемента
print(my_list[2]) # Доступ к элементу по индексу (вывод: 3)
Java
import java.util.ArrayList;
ArrayList<Object> myList = new ArrayList<>();
myList.add(1);
myList.add("hello");
System.out.println(myList.get(1)); // Доступ к элементу по индексу (вывод: hello)
PHP
$myList = array(1, 2, 3, 'a', 'b', 'c');
array_push($myList, 4); // Добавление элемента
echo $myList[2]; // Доступ к элементу по индексу (вывод: 3)
🚩Плюсы
➕Гибкость
Списки позволяют легко добавлять, удалять и изменять элементы.
➕Удобство использования
Простейшие операции над списками, такие как добавление или удаление элементов, обычно реализуются стандартными методами или функциями.
➕Поддержка индексов
Доступ к элементам по индексу позволяет эффективно манипулировать данными.
Ставь 👍 и забирай 📚 Базу знаний🤔 Реализация Fibonacci с рекурсией или без?
1. С рекурсией: проще написать, но требует больше памяти из-за вложенных вызовов.
2. Без рекурсии: итеративный метод или использование динамического программирования, эффективнее с точки зрения производительности.
3. Выбор зависит от задачи: рекурсия подходит для демонстрации, итерация — для практических целей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🖼️ Ищем PHP разработчиков. Релокейт, удалёнка, платим много!
Специально для Вас, собираем лучшие вакансии по PHP с прямыми контактами в Telegram на канале @it_match_php.
Подпишись чтобы не упустить свой шанс получить лучший оффер!
🔗 Посмотреть вакансии
🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Docker`е?
При развёртывании приложения в Docker важно минимизировать время сборки и оптимизировать слои контейнера.
🟠Использовать `.dockerignore`
Не копировать лишние файлы в контейнер (например,
node_modules, .git, vendor, .env).
.git node_modules vendor .env *.log🟠Оптимизировать `Dockerfile` (Меньше слоёв, кэширование) Плохо (лишние слои, без кэширования)
FROM php:8.2-cli
WORKDIR /app
COPY . . # Копирует ВСЕ файлы (долго и некэшируемо)
RUN composer install
RUN npm install
RUN npm run build
Хорошо (разделение слоёв, кэширование)
FROM php:8.2-cli
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist # Используем кэширование слоёв
COPY package.json package-lock.json ./
RUN npm install --only=production && npm cache clean --force
COPY . . # Копируем код ПОСЛЕ установки зависимостей (чтобы кэширование работало)
RUN npm run build
🟠Использовать `multi-stage builds` (если контейнер весит много)
Позволяет уменьшить размер конечного образа, убрав ненужные файлы и инструменты.
# 1-й этап: сборка зависимостей (Node.js)
FROM node:18 as frontend
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
# 2-й этап: финальный образ
FROM php:8.2-cli
WORKDIR /app
COPY --from=frontend /app/dist /app/public # Берём только готовые файлы
COPY . .
CMD ["php", "artisan", "serve", "--host=0.0.0.0"]
🟠Использовать `docker build --cache-from`
Позволяет использовать кеш из предыдущих сборок.
docker build --cache-from=myapp:latest -t myapp .
🟠Оптимизировать `docker-compose` (если используется)
Перенести volume для vendor и node_modules на хост, чтобы не скачивать их в контейнере.
services:
app:
build: .
volumes:
- .:/app
- /app/vendor # Чтобы composer install не запускался каждый раз
- /app/node_modules # Чтобы npm install не замедлял перезапуск
🟠Использовать `Alpine Linux` (если важен размер образа)
Alpine – лёгкая версия Linux (~5 MB), подходит для PHP, Nginx, Node.js.
FROM php:8.2-fpm-alpine
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое Low Coupling и High Cohesion?
• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какая разница между self и this?
self и this используются для ссылки на текущий класс и его экземпляр соответственно, но каждый из них имеет свои особенности и область применения.
🚩this
Используется для обращения к текущему объекту класса. Он позволяет получить доступ к нестатическим свойствам и методам объекта. Является ссылкой на вызываемый объект и используется внутри методов объекта для обращения к его свойствам и методам.
class Car {
public $color = 'red';
public function getColor() {
return $this->color; // Используется $this для доступа к свойству текущего объекта
}
}
$myCar = new Car();
echo $myCar->getColor(); // Выведет 'red'
🚩self
Используется для обращения к текущему классу и применяется в основном для доступа к статическим свойствам и методам класса. Ссылается на класс, в котором она была вызвана, и не требует создания экземпляра объекта для доступа к содержимому.
class Car {
public static $count = 0;
public function __construct() {
self::$count++; // Используется self для доступа к статическому свойству
}
public static function getTotalCars() {
return self::$count; // Обращение к статическому методу или свойству
}
}
$newCar1 = new Car();
$newCar2 = new Car();
echo Car::getTotalCars(); // Выведет '2'
🚩Основные различия
🟠Контекст использования
$this используется для доступа к свойствам и методам текущего объекта экземпляра, тогда как self используется для доступа к статическим свойствам и методам класса.
🟠Статический vs Нестатический
$this нельзя использовать в статических методах, потому что статические методы могут быть вызваны без создания объекта класса. self, напротив, предназначена для использования в статическом контексте.
🟠Привязка
self привязана к классу, в котором она написана, а $this — к объекту, через который вызывается метод.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое DI Container?
Это инструмент для управления зависимостями приложения.
• Он автоматически создаёт объекты и предоставляет их другим компонентам, решая, какие зависимости инъектировать.
• Контейнер упрощает реализацию DI, улучшает модульность и тестируемость приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Открыть бизнес? Конечно, со Сбером!
За 0₽ любой тариф расчётно-кассового обслуживания на месяц, выбирайте тот, который больше всего подойдёт вашему делу.
А также:
✅ бесплатные сервисы для ведения бизнеса: бухгалтерия для ИП, юрподдержка, электронный документооборот, отчётность в госорганы и многое другое. Всё, чтобы вам было удобно!
✅ специальные условия для тех, кто ведёт бизнес на маркетплейсах: безлимитные переводы на счета физлиц без комиссии.
Откройте счёт онлайн или в любом нашем офисе.
Узнать больше
Финансовые услуги оказывает: ПАО Сбербанк.
#реклама
sberbank.com
О рекламодателе
🤔 В чем недостатки асинхронного шифрования?
Асинхронное шифрование (или шифрование с открытым ключом, например, RSA, ECC) использует два ключа:
Открытый ключ (Public Key) – для шифрования
Закрытый ключ (Private Key) – для расшифровки
🚩Основные недостатки асинхронного шифрования
🟠Медленнее, чем симметричное шифрование
Шифрование и расшифровка занимают больше времени, потому что алгоритмы (например, RSA) используют сложные математические операции (экспоненцирование и факторизацию).
AES (симметричное) в 100–1000 раз быстрее, чем RSA.
🟠Длина ключа больше → больше ресурсов
Чтобы обеспечить безопасность, RSA требует очень длинных ключей (2048+ бит).
Чем длиннее ключ, тем больше памяти и CPU требуется для вычислений.
🟠Уязвимость к квантовым атакам
Квантовые компьютеры смогут быстро взломать RSA и ECC с помощью алгоритма Шора.
AES-256 останется безопасным, но RSA-2048 можно будет взломать за несколько часов или минут.
🟠Усложнённое управление ключами
Нужно генерировать, хранить и передавать пары ключей.
Закрытый ключ нельзя потерять – иначе данные невозможно расшифровать.
Если злоумышленник завладеет закрытым ключом, он сможет расшифровать всю информацию.
🟠Атаки MITM и проблемы доверия
Открытый ключ может быть подменён злоумышленником (атака "человек посередине" – MITM).
Если хакер подменит публичный ключ, он сможет расшифровать данные.
Ставь 👍 и забирай 📚 Базу знаний
Как списать долги? Бесплатно через МФЦ!
Долги от 200 000₽. Поможем бесплатно списать долг и расторгнуть все кредитные договоры!
Узнать больше
#реклама
нет-кредит.рф
О рекламодателе
🤔 Что делать, если у двух trait'ов один и тот же метод?
1. Если два trait содержат методы с одинаковыми именами, необходимо явно указать, какой метод использовать, с помощью use TraitName::methodName.
2. В сложных случаях можно переопределить метод в классе для явной реализации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое инкапсуляция?
Инкапсуляция — это один из основных принципов ООП. Она представляет собой механизм, позволяющий скрыть внутренние детали объекта и предоставлять доступ к данным и методам объекта только через определенные интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.
🚩Основные аспекты
🟠Сокрытие данных
Инкапсуляция позволяет скрыть внутреннее состояние объекта от внешнего мира. Данные объекта становятся доступными только через методы, предоставленные самим объектом.
🟠Контроль доступа
Внутренние данные и методы объекта могут быть объявлены как приватные (
private) или защищенные (protected), что предотвращает их прямой доступ из кода вне объекта. Публичные методы (public) используются для взаимодействия с объектом.
🟠Целостность данных
Поскольку доступ к данным осуществляется через методы, можно контролировать и проверять изменения состояния объекта, что помогает поддерживать его целостность и корректность.
class User {
// Приватные свойства
private $name;
private $email;
// Конструктор для инициализации свойств
public function __construct($name, $email) {
$this->setName($name);
$this->setEmail($email);
}
// Публичный метод для получения имени
public function getName() {
return $this->name;
}
// Публичный метод для установки имени
public function setName($name) {
if (!empty($name)) {
$this->name = $name;
} else {
throw new Exception("Name cannot be empty");
}
}
// Публичный метод для получения email
public function getEmail() {
return $this->email;
}
// Публичный метод для установки email
public function setEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
} else {
throw new Exception("Invalid email address");
}
}
}
// Создание объекта пользователя
$user = new User("John Doe", "john.doe@example.com");
// Получение и изменение данных через публичные методы
echo $user->getName(); // John Doe
$user->setEmail("new.email@example.com");
echo $user->getEmail(); // new.email@example.com
// Прямой доступ к приватным свойствам вызовет ошибку
// $user->name = "Jane"; // Ошибка
Ставь 👍 и забирай 📚 Базу знаний
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
