PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.44K subscribers
30 photos
1.05K links
Download Telegram
🤔 Почему symfony а не yii larevel?

Выбор между Symfony, Laravel и Yii зависит от множества факторов: сложности проекта, требований к производительности, удобства работы, документации и экосистемы. Давайте разберём, почему Symfony может быть предпочтительным вариантом.

🟠Гибкость и модульность (по сравнению с Laravel и Yii)
Symfony не монолитный, он построен на компонентах, которые можно использовать по отдельности.
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

$routes = new RouteCollection();
$routes->add('home', new Route('/home'));


🟠Производительность и масштабируемость
Symfony изначально создавался с акцентом на производительность и расширяемость.

🟠Современная архитектура (чем Laravel и Yii хуже)
Symfony следует чистой архитектуре SOLID и DDD (Domain-Driven Design).
Что это даёт
Чистый код (меньше "магии", как в Laravel).
Удобное тестирование (Mock объектов, KernelTestCase).
Поддержка CQRS, Event-Driven, Hexagonal Architecture.
class UserService {
private UserRepository $repo;

public function __construct(UserRepository $repo) {
$this->repo = $repo;
}

public function createUser(string $email): User {
return $this->repo->save(new User($email));
}
}


🟠Корпоративные решения (где Laravel и Yii не подходят)
Symfony часто используется в крупных проектах и государственных системах.

🟠Поддержка и сообщество
Symfony поддерживается разработчиками из SensioLabs и сообществом Symfony.
Laravel больше зависит от одного разработчика (Taylor Otwell).
Yii меньше поддерживается и отстаёт в развитии.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🤔2👍1
🤔 Что такое замыкание?

Это функция, которая «захватывает» переменные из внешней области видимости, в которой она была создана.
1. Оно позволяет использовать внешние переменные даже после завершения их контекста.
2. Замыкания полезны для сохранения состояния и создания функций с заранее заданными параметрами.
3. Пример: функция, возвращающая другую функцию, которая использует переменные из замыкающего контекста.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое DRY и KISS?

Они помогают писать чистый, понятный и эффективный код.

🟠DRY (Don't Repeat Yourself – Не повторяйся)
Смысл: Избегайте дублирования кода, выносите повторяющуюся логику в функции, классы или модули.
Улучшает читаемость кода.
Упрощает поддержку: изменили код в одном месте – обновилось везде.
Исключает ошибки при дублировании кода.

Плохо (нарушение DRY)
// Дублирование кода для расчёта скидки
$price1 = 100;
$discount1 = $price1 * 0.1;

$price2 = 200;
$discount2 = $price2 * 0.1;

$price3 = 300;
$discount3 = $price3 * 0.1;


Хорошо (принцип DRY)
function calculateDiscount($price) {
return $price * 0.1;
}

$discount1 = calculateDiscount(100);
$discount2 = calculateDiscount(200);
$discount3 = calculateDiscount(300);


🟠KISS (Keep It Simple, Stupid – Делай проще)
Смысл: Не усложняйте код, он должен быть простым и понятным.
Код легче понимать и исправлять.
Простота = меньше ошибок.
Улучшает производительность (сложные конструкции могут замедлять код).

Плохо (нарушение KISS)
function isEven($num) {
if ($num % 2 == 0) {
return true;
} else {
return false;
}
}


Хорошо (KISS)
function isEven($num) {
return $num % 2 == 0;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Зачем нужен абстрактный класс?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое агрегатные функции?

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

🚩Основные агрегатные функции

🟠COUNT()
Подсчитывает количество элементов в наборе. Эта функция может использоваться для подсчета количества строк в таблице или количества строк, соответствующих определенным критериям.
Пример: SELECT COUNT(*) FROM users; — подсчитывает количество всех строк в таблице users.

🟠SUM()
Суммирует числовые значения столбца. Используется для получения общей суммы числовых данных.
Пример: SELECT SUM(salary) FROM employees; — считает общую сумму зарплат всех сотрудников.

🟠AVG()
Вычисляет среднее значение числовых данных. Эта функция полезна для нахождения среднего значения определенного столбца.
Пример: SELECT AVG(price) FROM products; — рассчитывает среднюю цену продукта.

🟠MIN() и MAX()
Возвращают минимальное и максимальное значения в столбце соответственно. Эти функции используются для нахождения наименьших и наибольших значений.
Пример: SELECT MIN(age), MAX(age) FROM users; — находит минимальный и максимальный возраст среди пользователей.

🟠GROUP_CONCAT() (в MySQL) / STRING_AGG() (в PostgreSQL)
Склеивают строки из столбца, объединяя их в одну строку с разделителем. Пример (MySQL): SELECT GROUP_CONCAT(username SEPARATOR ', ') FROM users WHERE city = 'New York'; — объединяет имена пользователей из Нью-Йорка через запятую.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем преимущества асинхронного шифрования?

1. Безопасность: открытый ключ можно свободно распространять, закрытый ключ остаётся приватным.
2. Удобство обмена: не требуется передавать секретный ключ для шифрования.
3. Поддержка цифровой подписи: позволяет проверять подлинность отправителя.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Как типы связи реализуются в Larevel?

В Laravel связи между моделями реализуются через Eloquent ORM. Eloquent предоставляет удобные методы для работы с отношениями (relations) между таблицами в базе данных.

🚩Один к одному (`One to One`)
Каждая модель User имеет один Profile.
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}


В модели Profile
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}


Теперь можно получить профиль пользователя так
$user = User::find(1);
$profile = $user->profile; // Получаем профиль пользователя


🟠Один ко многим (`One to Many`)
Каждый Post может иметь много Comment.
В модели Post
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}


В модели Comment
class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
}


Теперь можно получить все комментарии к посту:
$post = Post::find(1);
$comments = $post->comments; // Коллекция комментариев


🟠Многие ко многим (`Many to Many`)
Каждый User может подписаться на несколько Role, и наоборот.
В Laravel для связи многие ко многим нужна промежуточная таблица role_user (название должно быть singular_singular в алфавитном порядке).
В модели User
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}


В модели Role
class Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class);
}
}


Теперь можно получить роли пользователя:
$user = User::find(1);
$roles = $user->roles;


Добавить роль:
$user->roles()->attach($roleId);


Удалить роль
$user->roles()->detach($roleId);


Синхронизировать (удалить старые и добавить новые):
$user->roles()->sync([1, 2, 3]);


🟠Связь через другую таблицу (`Has One / Has Many Through`)
Например, у нас есть Country, User, Post. Мы хотим получить все посты в стране.
class Country extends Model
{
public function posts()
{
return $this->hasManyThrough(Post::class, User::class);
}
}


Теперь можно получить все посты страны
$country = Country::find(1);
$posts = $country->posts;


🟠Полиморфные связи (`Polymorphic Relations`)
Позволяет разным моделям использовать одну таблицу для хранения данных.

Пример: у нас есть Post и Video, к которым могут быть Comment
В модели Comment
class Comment extends Model
{
public function commentable()
{
return $this->morphTo();
}
}


В модели Post
class Post extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}


В модели Video
class Video extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}


Использование
$post = Post::find(1);
$post->comments()->create(['content' => 'Отличный пост!']);

$video = Video::find(1);
$video->comments()->create(['content' => 'Крутое видео!']);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое инкапсуляция?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как спроектировать базу данных?

Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям.


🟠Определение требований и структуры данных
Сначала нужно понять, какие данные будут храниться и как они связаны.
Какие объекты будут в системе? (например, пользователи, заказы, товары).
Как они связаны друг с другом? (например, один пользователь может делать много заказов).
Какие поля нужны в каждой таблице? (например, email, password, created_at).
- Какие запросы будут выполняться чаще всего?

Пример: интернет-магазин
Пользователи (users)
Товары (products)
Заказы (orders)
Связь между заказами и товарами (order_items)

🟠Определение таблиц и связей (ERD – диаграмма)
Разделяем данные по таблицам и определяем связи (1-к-1, 1-к-N, N-к-N).
Связи между таблицами:
1-к-1 → один профиль = один пользователь (users → user_profiles).
1-к-N → один пользователь = много заказов (users → orders).
N-к-N → один заказ = много товаров, и один товар может быть в разных заказах (orders ↔️ products).
Users (id) --- (1:N) --- Orders (id, user_id) --- (N:M) --- Order_Items (order_id, product_id, quantity)
Products (id)


SQL-создание таблиц
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(255) UNIQUE,
password VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
price DECIMAL(10,2),
stock INT
);

CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как работает динамическая типизация?

Динамическая типизация позволяет переменной менять тип во время выполнения программы. Тип определяется автоматически на основе присвоенного значения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Имеет ли значение регистр заголовка?

Значение регистра заголовков может варьироваться в зависимости от конкретного контекста или системы разметки, в которой используются заголовки. Рассмотрим несколько примеров, чтобы понять, как различные системы относятся к регистру заголовков.

🚩HTML

Регистр заголовков не имеет значения. Теги HTML не чувствительны к регистру, поэтому <H1>Заголовок</H1> и <h1>Заголовок</h1> будут интерпретироваться одинаково.
<h1>Заголовок</h1>
<H1>Заголовок</H1>


🚩Markdown

Регистр заголовков также не имеет значения для самой разметки, но обычно принято использовать заглавные буквы для первых букв слов в заголовках, чтобы улучшить читаемость.
# Заголовок
# заголовок


🚩LaTeX

Регистр заголовков тоже не имеет значения с точки зрения разметки, но стандартной практикой является использование заглавных букв в начале каждого важного слова для улучшения читаемости.
\section{Заголовок}
\section{заголовок}


🚩Wiki-разметка (например, MediaWiki)

Регистр заголовков не влияет на разметку, но для консистентности и лучшей читаемости заголовки часто оформляют с заглавными буквами
= Заголовок =
= заголовок =


🚩Языки программирования

Как таковые не используются, но комментарии-заголовки могут быть оформлены по-разному. Регистр здесь также не имеет значения для компилятора или интерпретатора, но для людей, читающих код, использование заглавных букв может сделать заголовки более заметными
# ЗАГОЛОВОК УРОВНЯ 1
# заголовок уровня 1


Оба варианта являются допустимыми комментариями
// ЗАГОЛОВОК УРОВНЯ 1
// заголовок уровня 1


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем цель кодирования?

Кодирование обеспечивает:
1. Совместимость: преобразование данных в формат, который можно безопасно передавать или хранить.
2. Эффективность передачи: упрощение работы с различными системами и протоколами.
3. Защиту от ошибок: предотвращение искажений данных при передаче через сети.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Чем отличаются функции unset от unlink?

Функции unset() и unlink() в PHP выполняют совершенно разные задачи, несмотря на похожие названия.

🟠`unset()` – удаление переменной
unset() удаляет переменную из области видимости, но не освобождает память сразу.
$a = "Привет, мир!";
unset($a);
echo $a; // Ошибка: переменная не существует


🟠`unlink()` – удаление файла
unlink() удаляет файл с диска.
$file = "example.txt";

if (file_exists($file)) {
unlink($file); // Удаляет файл
echo "Файл удалён";
} else {
echo "Файл не найден";
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Для чего нужен ELT?

ELT (Extract, Load, Transform) – это процесс обработки данных, используемый в аналитике:
- Extract (Извлечение) – загрузка данных из источников (БД, API).
- Load (Загрузка) – сохранение данных в хранилище (например, в Data Warehouse).
- Transform (Преобразование) – очистка, фильтрация, агрегация данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
🤔 По чему WHERE AVG считает в среднем?

В SQL, когда мы используем AVG(), мы рассчитываем среднее значение по множеству строк. Но WHERE фильтрует отдельные строки, а не группы данных.

Проблема
SELECT * FROM products WHERE AVG(price) > 100; --  Ошибка!


🚩Как правильно использовать `AVG()` в фильтрах?

Использовать HAVING вместо WHERE (если есть GROUP BY)
SELECT category, AVG(price) as avg_price 
FROM products
GROUP BY category
HAVING AVG(price) > 100;


Использовать подзапрос (SUBQUERY) в WHERE
SELECT * FROM products 
WHERE price > (SELECT AVG(price) FROM products);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1💊1
🤔 По какому принципу объединяются и разделяются методы в интерфейсах?

Методы в интерфейсах группируются по роли или контракту, то есть:
- Каждый интерфейс должен описывать конкретное поведение (например, Serializable, Renderable).
- Принцип разделения интерфейса (Interface Segregation Principle, SOLID) — лучше несколько небольших интерфейсов, чем один громоздкий.
- Интерфейс отражает намерение: что объект умеет делать, а не как он это делает.
Это упрощает поддержку, повторное использование и тестирование кода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Расскажи про полиморфизм

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

🚩Зачем нужен полиморфизм?

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

🚩Виды полиморфизма

Полиморфизм через наследование (override, переопределение методов)
Полиморфизм через интерфейсы (реализация одного интерфейса разными классами)

🚩Полиморфизм через наследование

Допустим, у нас есть базовый класс Animal, у которого есть метод makeSound(). Разные животные будут издавать разные звуки, но все они будут использовать этот метод.
class Animal {
public function makeSound() {
return "Some sound";
}
}

class Dog extends Animal {
public function makeSound() {
return "Woof!";
}
}

class Cat extends Animal {
public function makeSound() {
return "Meow!";
}
}

function printSound(Animal $animal) {
echo $animal->makeSound() . PHP_EOL;
}

printSound(new Dog()); // Выведет "Woof!"
printSound(new Cat()); // Выведет "Meow!"


🚩Полиморфизм через интерфейсы

Иногда классы не связаны через наследование, но должны поддерживать общий метод. Для этого используется интерфейс:
interface Shape {
public function getArea(): float;
}

class Circle implements Shape {
private $radius;

public function __construct($radius) {
$this->radius = $radius;
}

public function getArea(): float {
return pi() * $this->radius * $this->radius;
}
}

class Rectangle implements Shape {
private $width, $height;

public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}

public function getArea(): float {
return $this->width * $this->height;
}
}

function printArea(Shape $shape) {
echo "Площадь: " . $shape->getArea() . PHP_EOL;
}

printArea(new Circle(5)); // Выведет площадь круга
printArea(new Rectangle(4, 6)); // Выведет площадь прямоугольника


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое namespaces

Namespaces в PHP — это способ организации кода для предотвращения конфликтов имен между классами, функциями и константами. Использование пространства имен позволяет создать уникальные идентификаторы, чтобы избежать пересечений между именами в крупных проектах или при использовании сторонних библиотек.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие уровни изоляции ты знаешь?

Уровни изоляции в системах управления базами данных (СУБД) определяют, как операции транзакций видят и взаимодействуют с изменениями, внесенными другими параллельно выполняющимися транзакциями. Эти уровни изоляции помогают контролировать различные виды аномалий, таких как грязное чтение, неповторяющееся чтение и фантомные чтения. В стандарте SQL существует четыре основных уровня изоляции:

🚩Read Uncommitted (чтение незафиксированных данных)

Этот уровень изоляции позволяет транзакциям видеть изменения других транзакций, даже если эти изменения еще не зафиксированы. Наименее строгий уровень изоляции, с наибольшей вероятностью возникновения аномалий.
Аномалии: Грязное чтение (Dirty Read): Транзакция может прочитать данные, которые были изменены другой транзакцией, но еще не зафиксированы.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;


🚩Read Committed (чтение зафиксированных данных)

Транзакция может видеть только те изменения, которые были зафиксированы другими транзакциями. Средний уровень изоляции, который предотвращает грязные чтения, но допускает другие аномалии.
Аномалии: Неповторяющееся чтение (Non-repeatable Read): Транзакция может дважды прочитать одно и то же значение и получить разные результаты, если другая транзакция изменила данные и зафиксировала изменения между двумя чтениями.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;


🚩Repeatable Read (повторяемое чтение)

Транзакция гарантирует, что если она читает данные, они останутся неизменными до завершения транзакции. Более строгий уровень изоляции, который предотвращает грязные и неповторяющиеся чтения, но не предотвращает фантомные чтения.
Аномалии: Фантомное чтение (Phantom Read): Транзакция может получить разные результаты при выполнении одного и того же запроса, если другая транзакция добавляет или удаляет строки, которые соответствуют условиям запроса.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;


🚩Serializable (сериабельность)

Самый строгий уровень изоляции, который эмулирует последовательное выполнение транзакций. Полностью предотвращает грязные чтения, неповторяющиеся чтения и фантомные чтения.
Аномалии: Никаких аномалий. Все транзакции выполняются так, как если бы они были выполнены последовательно.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Low Coupling и High Cohesion?

• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM