PHP | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
نمایش بیشتر2 348
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-107 روز
-2630 روز
آرشیو پست ها
🤔 Какие бывают области видимости?
Область видимости (или видимость) определяет, где в коде можно получить доступ к переменным, функциям и другим объектам. В PHP есть несколько видов областей видимости, которые контролируют доступность этих элементов в разных частях программы.
🚩Основные области видимости
🟠Локальная область видимости
Переменные, объявленные внутри функции, имеют локальную область видимости и доступны только внутри этой функции.
<?php
function test() {
$localVar = "I'm local";
echo $localVar; // Выведет "I'm local"
}
test();
echo $localVar; // Ошибка: переменная не найдена
?>
🟠Глобальная область видимости
Переменные, объявленные вне функций и классов, имеют глобальную область видимости и доступны везде в скрипте, кроме внутренних областей видимости (например, внутри функций), если не использовать ключевое слово global.
<?php
$globalVar = "I'm global";
function test() {
global $globalVar;
echo $globalVar; // Выведет "I'm global"
}
test();
?>
🟠Область видимости функций и методов
Переменные, объявленные внутри функции или метода класса, имеют свою локальную область видимости и не видны за её пределами.
<?php
class Test {
public function method() {
$localVar = "I'm local in method";
echo $localVar; // Выведет "I'm local in method"
}
}
$test = new Test();
$test->method();
echo $localVar; // Ошибка: переменная не найдена
?>
🟠Область видимости классов
Публичная (public)
Публичные свойства и методы доступны отовсюду: как внутри класса, так и вне его.
<?php
class Test {
public $publicVar = "I'm public";
public function publicMethod() {
echo $this->publicVar;
}
}
$test = new Test();
echo $test->publicVar; // Доступно и выведет "I'm public"
$test->publicMethod(); // Доступно и выведет "I'm public"
?>
🟠Защищённая (protected)
Защищённые свойства и методы доступны только внутри класса и его наследников.
<?php
class Base {
protected $protectedVar = "I'm protected";
protected function protectedMethod() {
echo $this->protectedVar;
}
}
class Derived extends Base {
public function accessProtected() {
echo $this->protectedVar; // Доступно
$this->protectedMethod(); // Доступно
}
}
$derived = new Derived();
$derived->accessProtected(); // Выведет "I'm protected"
// echo $derived->protectedVar; // Ошибка: доступ запрещен
// $derived->protectedMethod(); // Ошибка: доступ запрещен
?>
🟠Приватная (private)
Приватные свойства и методы доступны только внутри класса, в котором они объявлены, и недоступны в наследниках.
<?php
class Test {
private $privateVar = "I'm private";
private function privateMethod() {
echo $this->privateVar;
}
public function accessPrivate() {
$this->privateMethod(); // Доступно
}
}
$test = new Test();
$test->accessPrivate(); // Выведет "I'm private"
// echo $test->privateVar; // Ошибка: доступ запрещен
// $test->privateMethod(); // Ошибка: доступ запрещен
?>
🟠Локальная область видимости
Переменные доступны только внутри функции или метода, где они объявлены.
🟠Глобальная область видимости
Переменные доступны везде в скрипте, кроме внутренних областей видимости, если не используется global.
🟠Публичная область видимости
Свойства и методы доступны отовсюду.
🟠Защищённая область видимости
Свойства и методы доступны только внутри класса и его наследников.
🟠Приватная область видимости
Свойства и методы доступны только внутри класса, в котором они объявлены.
Ставь 👍 и забирай 📚 Базу знаний🤔 По какому принципу объединяются и разделяются методы в интерфейсах?
Методы в интерфейсах группируются по роли или контракту, то есть:
- Каждый интерфейс должен описывать конкретное поведение (например, Serializable, Renderable).
- Принцип разделения интерфейса (Interface Segregation Principle, SOLID) — лучше несколько небольших интерфейсов, чем один громоздкий.
- Интерфейс отражает намерение: что объект умеет делать, а не как он это делает.
Это упрощает поддержку, повторное использование и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем отличие между двойным и тройным равно?
🚩Примеры разницы между `==` и `===`
Сравнение чисел и строк
var_dump(5 == "5"); // ✅ true (PHP приводит строку "5" к числу 5)
var_dump(5 === "5"); // ❌ false (5 - это int, "5" - это string)
Сравнение true и false
var_dump(0 == false); // ✅ true (0 считается как false)
var_dump(0 === false); // ❌ false (0 - это int, а false - это bool)
Сравнение null
var_dump(null == false); // ✅ true (PHP считает null как false)
var_dump(null === false); // ❌ false (null != boolean)
Ставь 👍 и забирай 📚 Базу знаний🤔 Как устроен типичный тест на opening point?
Тест на Opening Point проверяет, корректно ли открывается доступ к ресурсу.
Он может включать:
- Авторизацию – доступ пользователя после входа.
- Перенаправления – корректный редирект при попытке входа.
- Доступность URL – проверка HTTP-ответа (например, 200 OK).
- Безопасность – отсутствие утечек при открытии ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как типы связи реализуются в 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' => 'Крутое видео!']);
Ставь 👍 и забирай 📚 Базу знаний🤔 Что известно про наследование?
Это механизм объектно-ориентированного программирования, позволяющий создавать классы на основе других классов. Позволяет повторно использовать код, добавлять или переопределять функциональность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие уровни изоляции ты знаешь?
Уровни изоляции в системах управления базами данных (СУБД) определяют, как операции транзакций видят и взаимодействуют с изменениями, внесенными другими параллельно выполняющимися транзакциями. Эти уровни изоляции помогают контролировать различные виды аномалий, таких как грязное чтение, неповторяющееся чтение и фантомные чтения. В стандарте 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;
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое traits?
Traits — это механизм PHP, который позволяет использовать повторно код в разных классах, без необходимости наследования. Traits содержат методы, которые можно внедрить в классы, что позволяет избегать дублирования кода. Они особенно полезны для разделения функциональности между классами, которые не могут наследоваться напрямую.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем преимущество фасада?
Фасад (Facade) в PHP — это паттерн проектирования, который упрощает доступ к сложной системе классов, предоставляя единый интерфейс.
🚩Плюсы
➕Упрощает код
Фасад скрывает сложные детали реализации и предоставляет удобный интерфейс.
$logger = new Logger();
$db = new DatabaseConnection();
$mailer = new Mailer();
$user = new User($db, $logger, $mailer);
$user->register("example@example.com");
С фасадом (всё инкапсулировано в один класс)
$userFacade = new UserFacade();
$userFacade->register("example@example.com");
➕Ослабляет зависимость кода от реализации
Вы можете изменять внутреннюю структуру классов без влияния на клиентский код.
➕Улучшает поддержку и масштабируемость
- Если нужно добавить новую функциональность, можно просто изменить фасад, не переписывая весь код.
- Удобно при развитии проекта и подключении новых сервисов.
🚩Пример фасада в PHP
class PaymentGateway {
public function processPayment($amount) {
echo "Оплата на сумму $amount выполнена.\n";
}
}
class NotificationService {
public function sendNotification($message) {
echo "Отправлено уведомление: $message\n";
}
}
class OrderFacade {
private $payment;
private $notification;
public function __construct() {
$this->payment = new PaymentGateway();
$this->notification = new NotificationService();
}
public function placeOrder($amount) {
$this->payment->processPayment($amount);
$this->notification->sendNotification("Заказ оплачен на сумму $amount.");
}
}
// Использование
$order = new OrderFacade();
$order->placeOrder(1000);
Ставь 👍 и забирай 📚 Базу знаний🤔 Имеет ли значение регистр заголовка?
Нет, не имеет.
В HTTP заголовки регистронезависимы.
Например, Content-Type, content-type, CONTENT-TYPE — это одно и то же.
Но значения заголовков могут быть чувствительны к регистру — зависит от конкретного поля.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие есть виды 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;
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое Entity?
Это объект, представляющий конкретную сущность в системе или домене. Обычно он имеет уникальный идентификатор и может изменяться в течение своего жизненного цикла.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое списочный тип?
Списочный тип данных, также известный как список, представляет собой структуру данных, которая хранит упорядоченные коллекции элементов. Списки позволяют хранить наборы элементов, доступ к которым можно получить по индексу. Они широко используются в программировании благодаря своей гибкости и удобству.
🚩Особенности
🟠Упорядоченность
Элементы в списке хранятся в определенном порядке, и этот порядок сохраняется. Каждый элемент имеет индекс, по которому к нему можно обратиться.
🟠Изменяемость
Списки обычно являются изменяемыми структурами данных, что означает, что вы можете добавлять, удалять или изменять элементы после создания списка.
🟠Гетерогенность
В списке могут храниться элементы различных типов данных (например, числа, строки, объекты).
🚩Примеры списочных типов в различных языках программирования
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)
🚩Плюсы
➕Гибкость
Списки позволяют легко добавлять, удалять и изменять элементы.
➕Удобство использования
Простейшие операции над списками, такие как добавление или удаление элементов, обычно реализуются стандартными методами или функциями.
➕Поддержка индексов
Доступ к элементам по индексу позволяет эффективно манипулировать данными.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое ООП?
Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции классов и объектов. Основные принципы ООП включают инкапсуляцию (скрытие деталей реализации), наследование (передача поведения от одного класса к другому), полиморфизм (способность методов работать с разными типами объектов) и абстракцию (выделение важной функциональности). ООП помогает организовывать код в удобные для понимания и поддерживаемые структуры.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое агрегат?
Агрегат – это термин, часто используемый в области баз данных и программирования, который обозначает способ группировки данных для выполнения различных операций, таких как суммирование, подсчёт, нахождение среднего значения и другие. В реляционных базах данных агрегаты применяются для выполнения агрегатных функций, таких как
SUM(), COUNT(), AVG(), MAX(), MIN() и других.
🚩Зачем нужны?
🟠Анализ данных:
Агрегаты позволяют получить сводные данные, которые помогают анализировать и понимать большие наборы данных. Например, можно узнать общее количество продаж, среднюю стоимость заказа, максимальную и минимальную зарплату сотрудников и т.д.
🟠Оптимизация запросов:
Использование агрегатных функций позволяет выполнять сложные вычисления на сервере базы данных, что экономит время и ресурсы по сравнению с выполнением этих операций на клиентской стороне.
🚩Примеры использования агрегатных функций:
Суммирование (SUM):
-- Получение общей суммы всех заказов
SELECT SUM(total_amount) AS total_sales
FROM orders;
Подсчёт (COUNT):
-- Подсчёт общего количества заказов
SELECT COUNT(*) AS total_orders
FROM orders;
Среднее значение (AVG):
-- Нахождение средней суммы заказа
SELECT AVG(total_amount) AS average_order_value
FROM orders;
Максимальное значение (MAX):
-- Нахождение максимальной суммы заказа
SELECT MAX(total_amount) AS max_order_value
FROM orders;
Минимальное значение (MIN):
-- Нахождение минимальной суммы заказа
SELECT MIN(total_amount) AS min_order_value
FROM orders;
🚩 Группировка данных с использованием GROUP BY:
Для более сложных запросов можно использовать агрегатные функции вместе с оператором GROUP BY, чтобы группировать данные по определённому критерию. В этом запросе результаты будут сгруппированы по customer_id, и для каждого клиента будет рассчитана общая сумма заказов.
-- Получение общей суммы заказов для каждого клиента
SELECT customer_id, SUM(total_amount) AS total_sales_per_customer
FROM orders
GROUP BY customer_id;
Ставь 👍 и забирай 📚 Базу знанийВсё, что вы любите, есть на Wildberries
Все мы ищем разное, но всегда находим что-то своё на WB — со скидками и доставкой.
Перейти на сайт
#реклама
wildberries.ru
О рекламодателе
🤔 Реализация Fibonacci с рекурсией или без?
1. С рекурсией: проще написать, но требует больше памяти из-за вложенных вызовов.
2. Без рекурсии: итеративный метод или использование динамического программирования, эффективнее с точки зрения производительности.
3. Выбор зависит от задачи: рекурсия подходит для демонстрации, итерация — для практических целей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что есть кроме микросервисной и монолитной архитектуры?
Помимо монолитной и микросервисной архитектуры, существуют другие подходы к построению программных систем. Каждый из них решает свои задачи и подходит для разных типов проектов.
🚩Service-Oriented Architecture (SOA) – Сервисно-ориентированная архитектура
- Это переходный вариант между монолитом и микросервисами.
- В SOA приложение делится на крупные сервисы (например, "Платежи", "Пользователи", "Заказы").
- Все сервисы взаимодействуют через ESB (Enterprise Service Bus) – специальный слой для связи между сервисами.
Для крупных корпоративных систем, где много интеграций.
Когда нужна централизованная логика взаимодействия сервисов.
🚩Serverless (Бессерверная архитектура)
- Код выполняется в облаке, а не на собственных серверах.
- Программист пишет функции (FaaS – Function as a Service), которые выполняются по запросу.
- Серверы управляются автоматически (AWS Lambda, Google Cloud Functions).
Когда нужно автоматическое масштабирование (например, обработка миллионов событий).
Для маленьких ивентовых задач (обработка файлов, уведомления, API-эндпоинты).
🚩Event-Driven Architecture (EDA) – Событийно-ориентированная архитектура
- Компоненты системы не вызывают друг друга напрямую, а общаются через события.
- Используется*message broker (Kafka, RabbitMQ, Redis Pub/Sub) для передачи данных.
В нагруженных системах, где много событий (банковские системы, биржи).
Когда нужна гибкость и асинхронность.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Какую проблему решают фабрика и фабричный метод?
Фабрика и фабричный метод решают проблему создания объектов в программе, отделяя процесс их создания от бизнес-логики. Это помогает сделать код более гибким, давая возможность изменять способ создания объектов без изменения основного кода. Эти паттерны используются для улучшения тестируемости, расширяемости и поддерживаемости программы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Сегодня последний день!
Акция на Пожизненный easyoffer PRO - по цене 1 года заканчивается сегодня.
PRO подписка включает:
– Доступ ко всем профессиям сайта без ограничений
– Все текущие и новые функции, которые будут появляться на сайте
👉 Акция до 31 марта 23:59 по МСК https://easyoffer.ru/pro
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
