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

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

前往频道在 Telegram

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

显示更多
2 346
订阅者
无数据24 小时
-37
-2430
帖子存档
🤔 Что делают self и static? В PHP self и static используются внутри классов для обращения к их свойствам и методам, но работают по-разному. Давайте разберёмся в их назначении и отличиях. 🚩self Используется для обращения к собственным методам и свойствам класса. Оно не учитывает наследование и всегда ссылается на тот класс, в котором написано.
class A {
    public static function who() {
        echo "Я класс A\n";
    }

    public static function call() {
        self::who(); // Вызываем метод who() внутри того же класса
    }
}

class B extends A {
    public static function who() {
        echo "Я класс B\n";
    }
}

B::call(); // Выведет: "Я класс A", а не "Я класс B"
🚩static Работает динамически, учитывает класс, из которого вызван метод. Это полезно в наследовании.
class A {
    public static function who() {
        echo "Я класс A\n";
    }

    public static function call() {
        static::who(); // Используем static вместо self
    }
}

class B extends A {
    public static function who() {
        echo "Я класс B\n";
    }
}

B::call(); // Выведет: "Я класс B"
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как настроить autoload через Composer? Composer предоставляет механизм автоматической загрузки классов (autoload), который позволяет не писать вручную require. Основные шаги: 1. Использовать PSR-4 или PSR-0 – правила именования классов. 2. Настроить autoload в composer.json – указать, какие пространства имен использовать. 3. Выполнить composer dump-autoload – обновить автозагрузку после изменения файлов. 4. Использовать require 'vendor/autoload.php' – подключить автозагрузку в проекте. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое acid? Это акроним, описывающий четыре ключевых свойства транзакций в системах управления базами данных (СУБД), обеспечивающие надежное выполнение транзакций даже в условиях ошибок, сбоев и множественного доступа. Эти свойства важны для обеспечения правильности и устойчивости данных. Он состоит из следующих компонентов: 🟠Атомарность (Atomicity) Гарантирует, что все операции в рамках одной транзакции либо выполняются полностью, либо не выполняются вообще. Если какая-либо часть транзакции не может быть завершена, система откатит все уже выполненные операции, возвращая базу данных в состояние, которое существовало до начала транзакции. Это "всё или ничего". 🟠Согласованность (Consistency) Означает, что каждая транзакция переводит базу данных из одного согласованного состояния в другое. Согласованность обеспечивает соблюдение всех правил и ограничений базы данных, таких как ключи, ограничения целостности и триггеры, после завершения транзакции. 🟠Изолированность (Isolation) Определяет способ одновременного выполнения множества транзакций без оказания влияния друг на друга. Это свойство предотвращает проблемы, связанные с одновременным доступом, такие как "грязное чтение", "неповторяющееся чтение" и "фантомное чтение". СУБД обычно предлагают различные уровни изоляции, которые могут быть настроены в зависимости от нужд приложения. 🟠Долговечность (Durability) Гарантирует, что как только транзакция была подтверждена, все изменения, сделанные транзакцией, сохраняются и остаются в базе данных даже в случае сбоя, например, при потере питания. Это означает, что система должна сохранять все записи в надежное, неизменяемое хранилище. Ставь 👍 и забирай 📚 Базу знаний

🤔 Сколькими способами можно создать ветку в Git? Создать ветку в Git можно: 1. Командой git branch <имя> – создаст новую ветку. 2. git checkout -b <имя> – создаст и сразу переключится. 3. git switch -c <имя> – альтернатива checkout. 4. В графических интерфейсах (GitKraken, SourceTree) – создание через UI. 5. В удаленном репозитории (GitHub, GitLab) – через web-интерфейс Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое типизация? Типизация в программировании — это механизм, который определяет, как значения различных типов (например, целые числа, строки, объекты и т.д.) обрабатываются и взаимодействуют в языке программирования. Типизация помогает предотвратить ошибки, связанные с некорректным использованием данных, и улучшает читаемость и поддержку кода. 🚩Виды типизации 🟠Статическая типизация: Типы переменных известны и проверяются на этапе компиляции. Примеры языков: Java, C++, TypeScript. 🟠Динамическая типизация: Типы переменных определяются и проверяются во время выполнения программы. Примеры языков: Python, JavaScript, PHP. 🟠Сильная типизация: Язык строго следит за типами, не позволяя неявные преобразования между ними. Примеры языков: Haskell, Java. 🟠Слабая типизация: Язык допускает неявные преобразования между типами. Примеры языков: PHP, JavaScript. PHP — язык с динамической и слабой типизацией, но с версией 7.0 и выше появилась возможность использовать строгую типизацию.
$number = 10;
$number = "ten"; // PHP позволяет это, так как тип переменной может изменяться
С PHP 7.0 можно использовать строгую типизацию для функций и методов. Это позволяет явно указывать, какого типа аргументы и возвращаемое значение должны быть.
declare(strict_types=1); // Включает строгую типизацию

function add(int $a, int $b): int {
    return $a + $b;
}

echo add(2, 3); // Работает
// echo add(2, "3"); // Ошибка, так как второй аргумент не является целым числом
🚩ПлюсыПредотвращение ошибок: Типизация помогает обнаруживать ошибки на ранних этапах разработки, таких как попытка выполнения некорректных операций с данными. ➕Улучшение читаемости и поддержки кода: Явное указание типов делает код более понятным и предсказуемым, что облегчает его поддержку и развитие. ➕Оптимизация выполнения: Статически типизированные языки позволяют компиляторам оптимизировать выполнение кода, так как типы известны на этапе компиляции. ➕Документирование кода: Типизация служит дополнительной документацией, помогая разработчикам понять, какие данные ожидаются и возвращаются функциями и методами. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Какими способами организовать порции? В PHP можно организовать обработку данных порциями разными способами, в зависимости от того, с чем именно мы работаем: с базой данных, файлами или массивами. Основные методы: SQL-запрос с LIMIT и OFFSET Чтение файла построчно (fgets(), SplFileObject) Итерация по массиву с array_chunk() Использование генераторов (yield) 🟠Постраничная выборка в SQL (`LIMIT` + `OFFSET`) При работе с базой данных мы можем загружать данные порциями с помощью LIMIT и OFFSET
$limit = 10;  // Количество записей на страницу  
$offset = 0;  // Смещение (номер страницы * $limit)  

$sql = "SELECT * FROM users ORDER BY id LIMIT $limit OFFSET $offset";
$result = $pdo->query($sql)->fetchAll();
Альтернативный вариант – постраничная выборка без OFFSET
$last_id = 0;
$sql = "SELECT * FROM users WHERE id > $last_id ORDER BY id LIMIT $limit";
🟠Чтение файла порциями (`fgets()`, `SplFileObject`) При работе с большими файлами можно читать их построчно, а не загружать в память целиком.fgets() – чтение построчно
$handle = fopen("large_file.txt", "r");
while (($line = fgets($handle)) !== false) {
    echo $line;
}
fclose($handle);
SplFileObject – более удобный способ
$file = new SplFileObject("large_file.txt");
while (!$file->eof()) {
    echo $file->fgets();
}
🟠Разделение массива на порции (`array_chunk()`) Если у нас массив данных, можно разбить его на части
$data = range(1, 100);
$chunks = array_chunk($data, 10);

foreach ($chunks as $chunk) {
    print_r($chunk); // Выведет массивы по 10 элементов
}
🟠Генераторы (`yield`) – ленивый способ Генераторы позволяют возвращать элементы по одному, не загружая всё в память сразу.
function getData() {
    for ($i = 1; $i <= 100; $i++) {
        yield $i; // Возвращает по одному значению
    }
}

foreach (getData() as $num) {
    echo $num . "\n";
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие известны распространенные способы кодирования в разработке? 1. Base64: для передачи бинарных данных в текстовом формате. 2. URL Encoding: преобразование специальных символов в безопасный формат для URL. 3. ASCII и Unicode: для кодировки символов. 4. JSON и XML: для структурирования данных. 5. UTF-8: стандарт кодировки текста. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем преимущество hash индекс и btree индекс? Hash-индексы и B-Tree-индексы являются двумя типами индексов, используемыми для ускорения операций поиска в базах данных. Оба типа имеют свои преимущества и недостатки в зависимости от конкретных сценариев использования. 🚩Hash-индексыБыстрый доступ по точному совпадению Hash-индексы обеспечивают очень быстрый доступ к данным при выполнении точных поисков (например, SELECT * FROM table WHERE column = 'value'). Время поиска практически константное (O(1)), что делает такие запросы очень эффективными. ➕Простота реализации Hash-индексы просты в реализации и не требуют сложных структур данных для управления. 🚩B-Tree-индексыПоддержка диапазонных запросов B-Tree-индексы поддерживают операции поиска по диапазону и сортировку (например, BETWEEN, >, <, ORDER BY). Данные в B-Tree отсортированы, что делает такие запросы возможными и эффективными. ➕Сбалансированность B-Tree автоматически поддерживает балансировку, что обеспечивает стабильную производительность для всех операций (поиск, вставка, удаление). ➕Универсальность B-Tree-индексы поддерживают широкий спектр операций и типов данных, включая текстовые данные, даты и числа. 🟠Hash-индекс Подходит для сценариев, где часто выполняются точные запросы равенства, например, поиск пользователя по уникальному идентификатору или email.
CREATE INDEX idx_email_hash ON users USING HASH (email);
SELECT * FROM users WHERE email = 'example@example.com';
🟠B-Tree-индекс Подходит для сценариев, где часто выполняются диапазонные запросы, сортировка или комбинированные условия.
CREATE INDEX idx_name_btree ON users (name);
SELECT * FROM users WHERE name BETWEEN 'A' AND 'M';
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что делает бэкслеш перед глобальными функциями? Бэкслеш (\) используется для обращения к глобальным функциям или классам, чтобы избежать их переопределения в текущем пространстве имён. Например, \strlen() вызовет глобальную функцию strlen, а не её версию из текущего namespace. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что делает бэк-слеш перед глобальными функциями? В PHP бэкслеш (\) перед именем функции или класса указывает, что мы обращаемся к глобальному пространству имён. Это важно, если код находится внутри namespace. 🚩Почему это важно? 🟠Пространства имён могут переопределять глобальные функции Если внутри namespace есть функция с таким же именем, то PHP будет искать её внутри пространства имён, а не в глобальном пространстве.
namespace App;

function strlen($str) {
    return "Фейковая длина строки";
}

echo strlen("Hello!"); // Выведет: "Фейковая длина строки"
🟠Бэкслеш заставляет PHP искать функцию в глобальном пространстве Пример использования \ для вызова стандартной функции PHP
namespace App;

function strlen($str) {
    return "Фейковая длина строки";
}

echo \strlen("Hello!"); // Выведет: 6 (из стандартной библиотеки PHP)
🟠Используется для ускорения работы кода PHP не будет искать функцию внутри namespace, а сразу возьмёт глобальную версию. Это немного ускоряет выполнение.
namespace App;

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    time(); // PHP ищет в namespace, потом в глобальном
}
$t2 = microtime(true);
echo "Обычный вызов: " . ($t2 - $t1) . " секунд\n";

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    \time(); // PHP сразу берёт глобальную функцию
}
$t2 = microtime(true);
echo "С бэкслешем: " . ($t2 - $t1) . " секунд\n";
Ставь 👍 и забирай 📚 Базу знаний

Онлайн-школа программирования Kata Academy Гарантия трудоустройства после обучения. ЗП от 120 000р гарантировано в договоре Хочешь войти в IT, но у тебя ноль опыта? Kata Academy — это твой шанс обрести новую профессию в программировании. Онлайн-обучение позволяет учиться из любого города. 💻 Переходи на сайт и оставляй заявку – расскажем подробности и поможем выбрать программу обучения. Начни свой путь в IT вместе с Kata Academy – мы тебя поддержим на каждом шаге! 🎓 Перейти на сайт #реклама 16+ kata.academy О рекламодателе

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

🤔 По какому принципу бы старались разделять модули, если находились бы не на уровне классов, а выше? Если говорить о разделении модулей на более высоком уровне, чем классы, то мы ориентируемся на архитектурные принципы. Основной подход — разделение ответственности (Separation of Concerns, SoC). 🚩Основные принципы разделения модулей 🟠SRP (Single Responsibility Principle, Принцип единственной ответственности) - Каждый модуль решает только одну задачу. - Например, отдельно: модуль аутентификации, модуль работы с БД, модуль обработки заказов. 🟠MVC (Model-View-Controller) - Разделение приложения на модель (логика данных), представление (интерфейс), контроллер (управление логикой). - Например, в Laravel: - Models/ — работа с данными - Views/ — шаблоны - Controllers/ — обработка запросов 🟠Чистая архитектура (Clean Architecture, Hexagonal, Onion) - Модули делятся на уровни, где: - Центральная часть — доменная логика (независимая от фреймворка). - Внешние слои — адаптеры, API, базы данных. - Код становится гибким и легко тестируемым. 🟠DDD (Domain-Driven Design, Предметно-ориентированное проектирование) - Разделение по бизнес-контексту (Bounded Contexts). - Например, в интернет-магазине: - Модуль заказов (Orders) - Модуль оплаты (Payments) - Модуль пользователей (Users) 🟠Микросервисная архитектура - Разделение системы на отдельные сервисы, которые общаются через API. - Например: - auth-service (регистрация, вход) - order-service (работа с заказами) - payment-service (оплата) - Удобно при высокой нагрузке и масштабировании. Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем заключается обработка ошибок и исключений? Это механизм выявления и реагирования на непредвиденные ситуации в коде. - Ошибки (Errors) – критические сбои (OutOfMemoryError, StackOverflowError). - Исключения (Exceptions) – проблемы в логике (NullPointerException, IOException). Обрабатываются с помощью try-catch-finally, throw, throws, а также глобальных обработчиков (onError, fallback strategies). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🖼️ Стажировки и вакансии для PHP разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Tel
🖼️ Стажировки и вакансии для PHP разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_php 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Что считается хорошо написанным Task`ом? Хорошо написанный Task (задача) должен быть понятным, конкретным и выполнимым. Если задача написана размыто, разработчик потратит больше времени на уточнение деталей, а не на саму работу. 🚩Основные принципы хорошего Task'а 🟠Чёткое и понятное название Плохо: Исправить баг (какой баг? где?) Хорошо: Исправить ошибку расчёта скидки при оформлении заказа 🟠Описание должно отвечать на 3 вопроса: Что нужно сделать? (конкретные действия) Зачем это нужно? (какая проблема решается) Как это проверить? (критерии выполнения) 🟠Минимум абстракции, максимум конкретики Плохо: Добавить авторизацию на сайт Хорошо: Добавить авторизацию через Google OAuth 2.0 для пользователей, чтобы они могли входить через Google-аккаунт 🟠Разбивать задачи на подзадачи (если задача сложная) Например, если задача "Реализовать корзину покупок", то лучше разбить её на: Добавление товаров в корзину Расчёт итоговой суммы Удаление товаров из корзины Оформление заказа 🟠Указывать требования (технические детали, ссылки, макеты, API, форматы данных) Если задача связана с API → указываем эндпоинты. Если UI → прикладываем макеты (Figma, Zeplin). Если есть примеры → добавляем скриншоты. 🟠Добавлять критерии выполнения (Definition of Done, DoD) Плохо: Сделать фильтр по цене Хорошо: Фильтр по цене должен работать в диапазоне от 0 до 100 000, быть интерактивным (ползунок), без перезагрузки страницы. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что делать, если у двух trait'ов один и тот же метод? 1. Если два trait содержат методы с одинаковыми именами, необходимо явно указать, какой метод использовать, с помощью use TraitName::methodName. 2. В сложных случаях можно переопределить метод в классе для явной реализации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое 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;
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Где можно столкнуться с динамической типизацией? Динамическая типизация характерна для языков, таких как Python, JavaScript, PHP. Например, переменная может быть сначала числом, а затем строкой. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний