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

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

前往频道在 Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

显示更多
2 346
订阅者
无数据24 小时
-37
-2430
帖子存档
🤔 Что такое декремент? декремент — это операция, используемые для увеличения или уменьшения значения переменной на единицу соответственно. 🚩Декремент Оператор уменьшает значение переменной на единицу. Он представлен двумя минусами (--). Так же, как и инкремент, декремент бывает двух видов: 🟠Префиксный декремент (`--x`) Сначала уменьшает значение переменной на единицу, затем возвращает новое значение. 🟠Постфиксный декремент (`x--`) Возвращает текущее значение переменной, а затем уменьшает его на единицу.
<?php
$x = 10;
$y = 10;

// Пример префиксного инкремента
echo ++$x; // Выводит 11, x теперь равен 11

// Пример постфиксного инкремента
echo $y++; // Выводит 10, y теперь равен 11
echo $y; // Выводит 11

// Пример префиксного декремента
echo --$x; // Выводит 10, x теперь равен 10

// Пример постфиксного декремента
echo $y--; // Выводит 11, y теперь равен 10
echo $y; // Выводит 10
?>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое ACID? ACID — это акроним, обозначающий четыре ключевых свойства транзакций в базах данных: Atomicity (атомарность), Consistency (согласованность), Isolation (изоляция), Durability (устойчивость). Эти свойства гарантируют надежное выполнение транзакций.? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Чтобы год прошел успешно, нужно уметь загадывать желания И это мы не про горящую салфетку в игристом (с огнем лучше не балуйт
Чтобы год прошел успешно, нужно уметь загадывать желания И это мы не про горящую салфетку в игристом (с огнем лучше не балуйтесь). Есть более безопасный и приятный способ. Мы в Selectel выделили собственный новогодний сервер, на котором можно сохранить письмо себе в 2026 год. Не стесняйся: напиши самые амбициозные мечты и хотелки, их все равно никто не прочитает. Кроме тебя: письмо вернется через 365 дней, можно будет вернуться к списку и увидеть, что сбылось ✨ Если сходу не мечтается — на лендинге есть подсказки и рекомендации. Поможет в конце года, когда мозги уже не хотят работать. Попробовать #реклама 16+ careers.selectel.ru О рекламодателе

🤔 Что такое автоматическая загрузка классов? Автоматическая загрузка классов (Autoloading) — это механизм, который позволяет не подключать вручную файлы с классами с помощью require или include. Вместо этого PHP автоматически загружает нужный класс при его первом использовании. 🚩Как работает автозагрузка? Без автозагрузки (ручное подключение)
require_once "Car.php";
require_once "Bike.php";

$car = new Car();
$bike = new Bike();
С автозагрузкой (PHP сам загружает классы)
spl_autoload_register(function ($class) {
    require_once $class . ".php";
});

$car = new Car(); // PHP сам загрузит "Car.php"
$bike = new Bike(); // PHP сам загрузит "Bike.php"
🚩Современный способ – автозагрузка через Composer Если проект использует Composer, можно настроить автозагрузку по стандарту PSR-4. 1⃣В composer.json добавляем:
"autoload": {
    "psr-4": {
        "App\\": "src/"
    }
}
2⃣В папке src/ создаём классы, например - src/Car.php - src/Bike.php 3⃣Запускаем команду
composer dump-autoload
4⃣Теперь можно использовать классы без require:
require 'vendor/autoload.php';

use App\Car;
use App\Bike;

$car = new Car();
$bike = new Bike();
Ставь 👍 и забирай 📚 Базу знаний

Ваша долгосрочная виза с ВИП-консьержем в Таиланде. ✨ Живите полно. Живите свободно. Живите без препятствий. Карта Thailand P
Ваша долгосрочная виза с ВИП-консьержем в Таиланде. ✨ Живите полно. Живите свободно. Живите без препятствий. Карта Thailand Privilege открывает двери в Таиланд: ✅ Долгосрочная виза на 5-20 лет, ✅ Услуга Элитный Персональный Ассистент (EPA) в аэропортах для идеальных поездок, ✅ Упрощенная отчетность по резидентству, права и банковские счета ✅ Привилегии для Вашего стиля жизни: от велнесс до путешествий. Узнать больше #реклама thailandprivilege.co.th О рекламодателе

🤔 Расскажи про полиморфизм Полиморфизм — это концепция ООП, которая позволяет объектам разных классов обрабатывать одинаковые сообщения или методы по-разному. Полиморфизм позволяет использовать общий интерфейс для взаимодействия с объектами разных типов, не зная их конкретный класс. Он облегчает расширение и поддержку кода, делая его более гибким и удобным для добавления новых классов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие уровни ошибок есть в PHP? В PHP существуют различные уровни ошибок, которые помогают разработчикам выявлять и исправлять проблемы в коде. Эти уровни ошибок задаются с помощью констант и управляются функцией error_reporting(). Рассмотрим основные уровни ошибок: 🚩Основные уровни ошибок в PHP 🟠E_ERROR (фатальная ошибка, код: 1) Критическая ошибка, которая приводит к завершению работы скрипта. Например, вызов несуществующей функции
someUndefinedFunction(); // Вызовет E_ERROR
🟠E_WARNING (предупреждение, код: 2) Не фатальная ошибка, скрипт продолжит выполнение. Например, деление на ноль или использование include() для несуществующего файла:
echo 10 / 0; // Вызовет E_WARNING
🟠E_PARSE (ошибка парсинга, код: 4) Ошибка синтаксиса в коде, обнаруживаемая на этапе компиляции. Например, забытая точка с запятой:
echo "Hello" // Отсутствует ;
🟠E_NOTICE (замечание, код: 8) Сообщает о некритичных ошибках, например, об использовании неинициализированной переменной:
echo $undefinedVariable; // Вызовет E_NOTICE
🟠E_CORE_ERROR (фатальная ошибка ядра, код: 16) Аналогична E_ERROR, но возникает на этапе загрузки PHP. 🟠E_CORE_WARNING (предупреждение ядра, код: 32) Аналогична E_WARNING, но на этапе загрузки PHP. 🟠E_COMPILE_ERROR (ошибка компиляции, код: 64) Ошибки, связанные с компиляцией скрипта, например, при ошибке в require. 🟠E_COMPILE_WARNING (предупреждение компиляции, код: 128) Предупреждения компилятора. 🟠E_USER_ERROR (пользовательская фатальная ошибка, код: 256) Вызывается вручную с помощью trigger_error():
trigger_error("Критическая ошибка!", E_USER_ERROR);
🟠E_USER_WARNING (пользовательское предупреждение, код: 512) Аналогично E_WARNING, но создаётся пользователем. 🟠E_USER_NOTICE (пользовательское замечание, код: 1024) Аналогично E_NOTICE, но вызывается вручную. 🟠E_STRICT (строгие предупреждения, код: 2048) Сообщает о потенциальных проблемах совместимости. 🟠E_RECOVERABLE_ERROR (обрабатываемая фатальная ошибка, код: 4096) Фатальная ошибка, которую можно обработать через set_error_handler(). 🟠E_DEPRECATED (предупреждение об устаревших функциях, код: 8192) Указывает, что используется устаревшая функция. 🟠E_USER_DEPRECATED (пользовательское предупреждение об устаревании, код: 16384) Вызывается пользователем через trigger_error(). 🚩Как управлять уровнями ошибок? PHP позволяет включать или выключать определённые ошибки с помощью error_reporting()
error_reporting(E_ALL); // Включить все ошибки
error_reporting(0); // Отключить вывод ошибок
error_reporting(E_ERROR | E_WARNING); // Только критические ошибки и предупреждения
Также можно использовать display_errors для отображения ошибок в браузере
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое рекурсия? Рекурсия — это метод в программировании, при котором функция вызывает сама себя. Рекурсия используется для решения задач, которые можно разбить на более мелкие, однотипные задачи.? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое CQRS? CQRS (Command Query Responsibility Segregation) – это архитектурный паттерн, который разделяет операции чтения (Query) и записи (Command) в приложении. Вместо одной модели данных используется две: Модель для чтения – оптимизирована для запросов. Модель для записи – отвечает за изменение данных. 🚩Зачем нужен CQRS? 🟠Производительность запросы можно кэшировать, а запись может происходить в другой базе. 🟠Гибкость можно использовать разные структуры данных для чтения и записи. 🟠Масштабируемость можно масштабировать чтение и запись отдельно. 🟠Безопасность можно ограничить доступ к записи. 🚩Как это работает? В классическом приложении чтение и запись используют одну модель данных
class User {
    public $id;
    public $name;
    public $email;
    
    public function updateEmail($newEmail) {
        $this->email = $newEmail;
    }
}
Команда (Command) – запись
class UpdateUserEmailCommand {
    public int $userId;
    public string $newEmail;
    
    public function __construct($userId, $newEmail) {
        $this->userId = $userId;
        $this->newEmail = $newEmail;
    }
}

class UserCommandHandler {
    public function handle(UpdateUserEmailCommand $command) {
        // Логика обновления в БД
        $db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
        $stmt = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
        $stmt->execute([
            ':email' => $command->newEmail,
            ':id' => $command->userId
        ]);
    }
}
Запрос (Query) – чтение
class UserQueryHandler {
    public function getUserById($userId) {
        $db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
        $stmt = $db->prepare("SELECT id, name, email FROM users WHERE id = :id");
        $stmt->execute([':id' => $userId]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}
🚩CQRS + Event Sourcing Часто CQRS используется вместе с Event Sourcing – вместо изменения данных мы создаем события.
class UserEmailUpdatedEvent {
    public int $userId;
    public string $newEmail;
    
    public function __construct($userId, $newEmail) {
        $this->userId = $userId;
        $this->newEmail = $newEmail;
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Rest REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов. Он основывается на стандартах HTTP и включает использование простых методов (GET, POST, PUT, DELETE) для взаимодействия с ресурсами, представленных в виде URL. RESTful API являются безсессионными, и каждый запрос от клиента к серверу должен содержать всю необходимую информацию для выполнения операции. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между вертикальным и горизонтальным масштабированием? Масштабирование (scaling) — это процесс увеличения мощности системы, чтобы она справлялась с увеличенной нагрузкой. В программировании и серверной архитектуре есть два типа масштабирования: Вертикальное масштабирование (Vertical Scaling, Scale-Up) Горизонтальное масштабирование (Horizontal Scaling, Scale-Out) 🚩Вертикальное масштабирование (Vertical Scaling) - Улучшение одного сервера: больше оперативной памяти (RAM), мощнее процессор (CPU), быстрее диск (SSD/NVMe). - Приложение остаётся на одном сервере, просто он становится мощнее. 🚩Горизонтальное масштабирование (Horizontal Scaling) - Добавляются новые серверы, работающие параллельно. - Нагрузка распределяется между несколькими машинами. - Используются балансировщики нагрузки (Nginx, HAProxy, AWS ELB). Ставь 👍 и забирай 📚 Базу знаний

🤔 Какими способами организовать порции? Разделение данных на порции (batch processing) может быть организовано разными методами: 1. LIMIT и OFFSET – классический способ для пагинации в SQL. 2. Cursor-based pagination – используется в API, позволяет получать новые данные без смещения. 3. Частичная загрузка данных – загружать данные по мере необходимости (lazy loading). 4. Очереди (Message Queues) – например, RabbitMQ или Kafka для обработки данных в потоках. 5. Шардирование данных – разделение больших таблиц на более мелкие логические части. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие модификаторы видимости есть в РНР? В PHP есть три основных модификатора видимости для свойств и методов классов: public, protected и private. Они определяют, какой код имеет доступ к этим свойствам и методам. 🟠`public` (публичный) Свойства и методы, объявленные как public, доступны отовсюду - как изнутри класса, так и извне, а также из наследуемых классов.
class MyClass {
    public $publicProperty = 'Public';

    public function publicMethod() {
        echo 'This is a public method';
    }
}

$obj = new MyClass();
echo $obj->publicProperty; // Выведет: Public
$obj->publicMethod(); // Выведет: This is a public method
🟠`protected` (защищённый) Свойства и методы, объявленные как protected, доступны только внутри класса и в классах-наследниках. Они недоступны для внешнего кода.
class MyClass {
    protected $protectedProperty = 'Protected';

    protected function protectedMethod() {
        echo 'This is a protected method';
    }
}

class ChildClass extends MyClass {
    public function accessProtected() {
        echo $this->protectedProperty; // Выведет: Protected
        $this->protectedMethod(); // Выведет: This is a protected method
    }
}

$obj = new ChildClass();
$obj->accessProtected(); 
🟠`private` (приватный) Свойства и методы, объявленные как private, доступны только внутри самого класса. Они недоступны ни для внешнего кода, ни для классов-наследников.
class MyClass {
    private $privateProperty = 'Private';

    private function privateMethod() {
        echo 'This is a private method';
    }

    public function accessPrivate() {
        echo $this->privateProperty; // Выведет: Private
        $this->privateMethod(); // Выведет: This is a private method
    }
}

$obj = new MyClass();
$obj->accessPrivate();
🚩Зачем нужны модификаторы видимости 🟠Инкапсуляция Модификаторы видимости помогают скрывать внутреннее состояние и детали реализации объекта, предоставляя только необходимые интерфейсы для взаимодействия. 🟠Безопасность Они защищают данные от неконтролируемого доступа и изменения, что повышает надежность и безопасность кода. 🟠Поддержка и развитие кода Позволяют контролировать доступ к методам и свойствам, что упрощает изменение и расширение кода без риска нарушить существующую функциональность. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое миграции? Это механизм управления изменениями в структуре базы данных. 1. Позволяют добавлять, изменять или удалять таблицы, столбцы и индексы в контролируемой форме. 2. Помогают синхронизировать структуру базы данных между разработчиками и окружениями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как работает бинарное дерево? Бинарное дерево – это структура данных, где каждый узел имеет максимум 2 потомка: Левый потомок содержит меньшие значения. Правый потомок содержит большие значения. 🚩Как устроено бинарное дерево? Каждый узел состоит из: Значения (value) – данные в узле. Ссылки на левый (left) и правый (right) потомки (или null, если потомка нет).
       8
      / \
     3   10
    / \    \
   1   6    14
      / \   /
     4   7 13
🚩Основные операции с бинарным деревом 🟠Вставка нового элемента Если дерево пустое → создаём корневой узел. Сравниваем значение с корнем: - Если меньше → идём налево. - Если больше → идём направо. Повторяем, пока не найдём свободное место.
       8
      / \
     3   10
    / \    
   1   6  
      / \  
     4   7  
    /
   5  <-- новый элемент добавляется слева от 6
Код вставки в PHP
class Node {
    public int $value;
    public ?Node $left = null;
    public ?Node $right = null;

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

class BinaryTree {
    public ?Node $root = null;

    public function insert(int $value) {
        $this->root = $this->insertRec($this->root, $value);
    }

    private function insertRec(?Node $node, int $value): Node {
        if ($node === null) return new Node($value);
        if ($value < $node->value) $node->left = $this->insertRec($node->left, $value);
        else $node->right = $this->insertRec($node->right, $value);
        return $node;
    }
}

$tree = new BinaryTree();
$tree->insert(8);
$tree->insert(3);
$tree->insert(10);
$tree->insert(6);
$tree->insert(14);
🟠Поиск элемента в дереве Алгоритм: Начинаем с корня. Если value == корень → найдено. Если value < корень → ищем влево. Если value > корень → ищем вправо. 1. 6 < 8 → идём влево к 3. 2. 6 > 3 → идём вправо к 6. 3. Нашли!
public function search(?Node $node, int $value): ?Node {
    if ($node === null || $node->value === $value) return $node;
    return ($value < $node->value)
        ? $this->search($node->left, $value)
        : $this->search($node->right, $value);
}

$foundNode = $tree->search($tree->root, 6);
echo $foundNode ? "Найдено: " . $foundNode->value : "Не найдено";
🟠Удаление элемента из дерева Сложность: 1. Если узел – лист → просто удаляем. 2. Если у узла один потомок → заменяем его потомком. 3. Если два потомка → находим минимальный элемент в правом поддереве и заменяем им удаляемый узел. Пример удаления 3 (у него есть два потомка 1 и 6): 1. Находим минимальный узел в правом поддереве → 4. 2. Заменяем 3 на 4.
       8
      / \
     3   10
    / \    
   1   6  
      / \  
     4   7  
После удаления 3
       8
      / \
     4   10
    / \    
   1   6  
      / \  
     5   7
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что запрещает final? Модификатор final запрещает наследование класса, если он указан перед его объявлением. Если final используется для метода, он запрещает переопределение этого метода в дочерних классах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как сделать так, чтобы сессии не хранились в файле? Для хранения сессий не в файлах в PHP, можно использовать другие механизмы хранения, такие как базы данных, кэш-сервисы (например, Redis или Memcached) или специализированные хранилища. 🚩Хранение сессий в базе данных 1⃣Создайте таблицу для хранения сессий:
CREATE TABLE sessions (
    id VARCHAR(255) PRIMARY KEY,
    data TEXT,
    last_access TIMESTAMP
);
2⃣Создайте обработчики сессий: Создайте класс для обработки сессий, реализующий интерфейс SessionHandlerInterface.
class DBSessionHandler implements SessionHandlerInterface {
    private $pdo;

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

    public function open($savePath, $sessionName) {
        return true;
    }

    public function close() {
        return true;
    }

    public function read($id) {
        $stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = :id");
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        $session = $stmt->fetch(PDO::FETCH_ASSOC);
        return $session ? $session['data'] : '';
    }

    public function write($id, $data) {
        $stmt = $this->pdo->prepare("REPLACE INTO sessions (id, data, last_access) VALUES (:id, :data, NOW())");
        $stmt->bindParam(':id', $id);
        $stmt->bindParam(':data', $data);
        return $stmt->execute();
    }

    public function destroy($id) {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = :id");
        $stmt->bindParam(':id', $id);
        return $stmt->execute();
    }

    public function gc($maxlifetime) {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < NOW() - INTERVAL :maxlifetime SECOND");
        $stmt->bindParam(':maxlifetime', $maxlifetime, PDO::PARAM_INT);
        return $stmt->execute();
    }
}
3⃣Инициализация сессий:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$handler = new DBSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();
🚩Хранение сессий в Redis 1⃣Установите расширение `phpredis`Для Ubuntu:
sudo apt-get install php-redis
2⃣Используйте Redis для хранения сессий: Настройте PHP для использования Redis в качестве хранилища сессий, добавив настройки в файл php.ini или в коде.
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое инкремент и декремент? Инкремент (`++`) и декремент (`--`) — это операции в PHP и других языках программирования, которые увеличивают или уменьшают значение переменной на единицу соответственно.? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего нужна рефлексия? Рефлексия (Reflection) – это механизм анализа классов, методов, свойств и других структур во время выполнения. Она позволяет получать информацию о коде и даже изменять его динамически. 🚩Когда полезна рефлексия? 🟠Фреймворки и DI-контейнеры - Используется для автоматического внедрения зависимостей (Dependency Injection, DI). - Например, Laravel использует рефлексию в Container для автоматического создания объектов.
class Database {
    public function connect() {
        return "Подключение к базе данных";
    }
}

class UserService {
    private $db;

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

    public function getUser() {
        return "Пользователь найден";
    }
}

function resolve($class) {
    $reflector = new ReflectionClass($class);
    $constructor = $reflector->getConstructor();
    
    if (!$constructor) {
        return new $class;
    }

    $params = $constructor->getParameters();
    $dependencies = [];

    foreach ($params as $param) {
        $type = $param->getType();
        if ($type) {
            $dependencies[] = resolve($type->getName());
        }
    }

    return $reflector->newInstanceArgs($dependencies);
}

$service = resolve(UserService::class);
echo $service->getUser(); // "Пользователь найден"
🟠Декораторы, аннотации и атрибуты - В PHP 8 появились атрибуты (аннотации), и рефлексия помогает их читать. - Используется в Symfony, Doctrine для работы с ORM.
#[Attribute]
class Route {
    public function __construct(public string $path) {}
}

class Controller {
    #[Route('/home')]
    public function home() {
        return "Домашняя страница";
    }
}

$reflection = new ReflectionMethod(Controller::class, 'home');
$attributes = $reflection->getAttributes(Route::class);
$route = $attributes[0]->newInstance();

echo $route->path; // "/home"
🟠Автоматическая генерация документации - Реально использовать для автоматического создания Swagger/OpenAPI. - Можно извлекать PHPDoc-комментарии и на их основе генерировать документацию.
class Example {
    /**
     * Возвращает приветствие
     * @return string
     */
    public function sayHello() {
        return "Привет!";
    }
}

$reflection = new ReflectionMethod(Example::class, 'sayHello');
echo $reflection->getDocComment();
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое логирование? Это запись событий, ошибок и действий приложения в журнал для диагностики и анализа. 1. Логи помогают отслеживать выполнение кода, анализировать сбои и выявлять узкие места. 2. Используются различные уровни логов: INFO, DEBUG, ERROR. 3. Это важный инструмент для отладки, мониторинга и аудита системы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний