fa
Feedback
PHP | Вопросы собесов

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 подписка включает: – Д
Сегодня последний день! Акция на Пожизненный easyoffer PRO - по цене 1 года заканчивается сегодня. PRO подписка включает: – Доступ ко всем профессиям сайта без ограничений – Все текущие и новые функции, которые будут появляться на сайте 👉 Акция до 31 марта 23:59 по МСК https://easyoffer.ru/pro