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

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

Открыть в Telegram
2 344
Подписчики
-224 часа
-57 дней
-2430 день
Архив постов
🤔 Что такое Rest? Это архитектурный стиль для создания веб-сервисов, который был предложен Роем Филдингом в его докторской диссертации в 2000 году. В его основе лежит принцип использования стандартных HTTP методов (GET, POST, PUT, DELETE и др.) для взаимодействия с ресурсами, представленными в виде URL. 🚩Основные принципы 🟠Адресуемость (Addressability) Каждому ресурсу (например, пользователю, товару) соответствует уникальный URL. 🟠Использование стандартных методов HTTP Использует методы HTTP для выполнения операций с ресурсами. GET: Получение данных. POST: Создание нового ресурса. PUT: Обновление существующего ресурса. DELETE: Удаление ресурса. 🟠Статусность (Statelessness) Каждый запрос к серверу должен содержать всю необходимую информацию для его обработки. Сервер не хранит информацию о состоянии клиента между запросами. 🟠Кэширование (Caching) Ответы от сервера могут кэшироваться, чтобы улучшить производительность и снизить нагрузку на сервер. 🟠Единообразие интерфейса (Uniform Interface) Все взаимодействия между клиентом и сервером стандартизированы, что упрощает интеграцию и взаимодействие между системами. 🚩Примеры 🟠Получение списка пользователей (GET) Запрос
GET /users
Ответ
[
  {"id": 1, "name": "Alice"},
  {"id": 2, "name": "Bob"}
]
🟠Получение информации о конкретном пользователе (GET) Запрос
GET /users/1
Ответ
{
  "id": 1,
  "name": "Alice"
}
🟠Создание нового пользователя (POST) Запрос
POST /users
Content-Type: application/json

{
  "name": "Charlie"
}
Ответ (Успешное создание)
{
  "id": 3,
  "name": "Charlie"
}
🟠Обновление информации о пользователе (PUT) Запрос
PUT /users/1
Content-Type: application/json

{
  "name": "Alice Updated"
}
Ответ
{
  "id": 1,
  "name": "Alice Updated"
}
🟠Удаление пользователя (DELETE) Запрос
DELETE /users/1
Ответ (Успешное удаление)
{
  "message": "User deleted"
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем отличается merge от rebase? 1. Merge объединяет ветки, создавая дополнительный коммит слияния, сохраняя историю изменений. 2. Rebase перезаписывает историю, перенося изменения текущей ветки на другую, делая историю линейной. 3. Merge проще для командной работы, тогда как Rebase удобен для поддержания чистоты истории. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое di container? Это специальный инструмент или объект в программировании, который управляет созданием и внедрением зависимостей в объекты. Этот контейнер автоматически решает, какие зависимости требуются объекту, и предоставляет их при создании объекта, тем самым упрощая управление зависимостями в приложении. 🚩Зачем нужен DI-контейнер 🟠Автоматизация управления зависимостями DI-контейнер автоматически создает и внедряет зависимости, избавляя от необходимости вручную передавать их в объекты. 🟠Гибкость и модульность Позволяет легко заменять реализации зависимостей, не изменяя код, который их использует. 🟠Упрощение тестирования Обеспечивает легкую замену зависимостей на моки или заглушки для тестирования. 🟠Улучшение структуры кода Разделяет создание объектов и их использование, способствуя более чистой архитектуре. 🚩Как используется DI-контейнер DI-контейнеры предоставляют различные методы для регистрации зависимостей и их последующего получения. Ниже приведен пример реализации простого DI-контейнера. 1⃣Создание интерфейсов и реализаций зависимостей
interface Logger {
    public function log($message);
}

class FileLogger implements Logger {
    public function log($message) {
        echo "Logging message to a file: $message";
    }
}

interface PaymentProcessor {
    public function processPayment($amount);
}

class StripePaymentProcessor implements PaymentProcessor {
    public function processPayment($amount) {
        echo "Processing payment of $amount through Stripe";
    }
}
2⃣Реализация DI-контейнера
class DIContainer {
    private $bindings = [];

    public function bind($abstract, $concrete) {
        $this->bindings[$abstract] = $concrete;
    }

    public function resolve($abstract) {
        if (!isset($this->bindings[$abstract])) {
            throw new Exception("No binding found for $abstract");
        }

        $concrete = $this->bindings[$abstract];

        // Если $concrete является замыканием, вызываем его
        if ($concrete instanceof Closure) {
            return $concrete($this);
        }

        // Создаем новый объект конкретного класса
        return new $concrete;
    }
}
3⃣Регистрация зависимостей и их использование
$container = new DIContainer();

// Регистрация зависимостей
$container->bind(Logger::class, FileLogger::class);
$container->bind(PaymentProcessor::class, function($container) {
    return new StripePaymentProcessor();
});

// Получение зависимостей
$logger = $container->resolve(Logger::class);
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.

$paymentProcessor = $container->resolve(PaymentProcessor::class);
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe
🚩Плюсы и минусыАвтоматизация Снижает необходимость ручного создания и передачи зависимостей. ➕Гибкость Легко изменять конкретные реализации зависимостей. ➕Тестируемость Упрощает замену зависимостей на моки для тестирования. ➕Чистота кода Упрощает код, делая его более модульным и читаемым. ➖Сложность настройки Могут потребоваться значительные усилия для первоначальной настройки DI-контейнера. ➖Производительность В некоторых случаях может снижать производительность из-за необходимости разрешения зависимостей. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое ключи в БД? Это атрибуты или комбинации атрибутов, которые однозначно идентифицируют строки в таблице. 1. Первичный ключ (Primary Key): гарантирует уникальность строк и запрещает NULL. 2. Внешний ключ (Foreign Key): связывает строки одной таблицы с другой. 3. Они помогают поддерживать целостность данных и улучшать производительность запросов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие версии PHP сейчас поддерживаются? 🟠PHP 8.1 Активная поддержка завершена: 25 ноября 2023 года. Поддержка безопасности: до 31 декабря 2025 года. Эта версия получает только исправления критических проблем безопасности. 🟠PHP 8.2 Активная поддержка: до 31 декабря 2024 года. Поддержка безопасности: до 31 декабря 2026 года. Эта версия получает как исправления багов, так и обновления безопасности. 🟠PHP 8.3 Активная поддержка: до 31 декабря 2025 года. Поддержка безопасности: до 31 декабря 2027 года. Это последняя версия, которая активно поддерживается и получает регулярные обновления и исправления багов. Ставь 👍 и забирай 📚 Базу знаний

🧠 Machine Learning — авторский канал, где собрана вся база по ИИ и машинному обучению. Senior разработчик AI-алгоритмов и ав
+5
🧠 Machine Learning — авторский канал, где собрана вся база по ИИ и машинному обучению. Senior разработчик AI-алгоритмов и автономных агентов, разбирает гайды, редкую литературу и код топовых моделей машинного обучения и искусственного интеллекта. В 2025 году ИИ выйдет на совершенно новый уровень тот, кто не успеет за прогрессом - отстанет, а кто разберется - сорвет куш. Стоит подписаться: t.me/ai_machinelearning_big_data

🤔 Что такое первичный ключ? Это уникальный идентификатор строки в таблице базы данных. 1. Гарантирует уникальность каждой записи. 2. Не может содержать NULL значений и дублирующихся данных. 3. Используется для создания связей между таблицами (внешние ключи). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между фабрикой и фабричным методом? Это два разных паттерна проектирования, которые используются для создания объектов. Они решают схожие задачи, но делают это разными способами и имеют свои особенности. 🚩Фабрика (Factory) Это паттерн проектирования, который создает объекты без необходимости явно указывать точный класс создаваемого объекта. Это делается через центральный объект, который управляет созданием других объектов.
<?php
class Car {
    public function drive() {
        echo "Driving a car";
    }
}

class Bike {
    public function ride() {
        echo "Riding a bike";
    }
}

class VehicleFactory {
    public function createVehicle($type) {
        if ($type === 'car') {
            return new Car();
        } elseif ($type === 'bike') {
            return new Bike();
        } else {
            throw new Exception("Vehicle type not supported");
        }
    }
}

$factory = new VehicleFactory();
$vehicle = $factory->createVehicle('car');
$vehicle->drive(); // Выведет "Driving a car"
?>
🚩Фабричный метод (Factory Method) Это паттерн проектирования, который определяет интерфейс для создания объектов, но позволяет подклассам изменять тип создаваемых объектов. Это достигается путем делегирования создания объектов подклассам.
<?php
abstract class VehicleFactory {
    abstract public function createVehicle();

    public function deliver() {
        $vehicle = $this->createVehicle();
        $vehicle->drive();
    }
}

class Car {
    public function drive() {
        echo "Driving a car";
    }
}

class Bike {
    public function ride() {
        echo "Riding a bike";
    }
}

class CarFactory extends VehicleFactory {
    public function createVehicle() {
        return new Car();
    }
}

class BikeFactory extends VehicleFactory {
    public function createVehicle() {
        return new Bike();
    }
}

$carFactory = new CarFactory();
$carFactory->deliver(); // Выведет "Driving a car"

$bikeFactory = new BikeFactory();
$bikeFactory->deliver(); // Выведет "Riding a bike"
?>
Ставь 👍 и забирай 📚 Базу знаний

🤔 В composer.json чем отличаются require и require-dev? 1. require: включает зависимости, необходимые для работы приложения. 2. require-dev: содержит зависимости, используемые только в разработке или тестировании, например, тестовые библиотеки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница между pull и fetch? Это две команды Git, используемые для синхронизации локального репозитория с удаленным репозиторием. Хотя обе команды служат для получения данных с удаленного репозитория, они работают по-разному и имеют разные цели. 🚩git fetch Загружает последние изменения из удаленного репозитория в локальный, но не сливает (merge) эти изменения с вашей текущей веткой. Она просто обновляет данные о состоянии удаленного репозитория и создает или обновляет локальные копии удаленных веток. Когда использовать: Когда вы хотите увидеть изменения в удаленном репозитории без их слияния с вашей текущей веткой. Когда вы планируете самостоятельно управлять процессом слияния или реорганизации изменений.
git fetch origin
🚩git pull Команда git pull комбинирует команды git fetch и git merge. Она загружает последние изменения из удаленного репозитория и сразу же пытается объединить (merge) их с вашей текущей веткой. Это позволяет быстро обновить вашу ветку с учетом последних изменений из удаленного репозитория. Когда использовать: Когда вы хотите быстро получить последние изменения из удаленного репозитория и объединить их с вашей текущей работой. Когда вам нужно синхронизироваться с основной веткой разработки.
git pull origin main
🚩Основные отличия 🟠Процесс git fetch: Получает изменения, но не объединяет их автоматически. Вы сами решаете, когда и как их объединять. git pull: Получает и сразу пытается объединить изменения. 🟠Контроль git fetch: Предоставляет больше контроля над процессом слияния. Вы можете изучить изменения перед их объединением. git pull: Быстрый способ обновления, но может привести к конфликтам слияния, которые придется решать сразу. 🟠Использование git fetch: Предпочтителен, когда вам нужно сначала просмотреть изменения или когда вы работаете над веткой, которая не должна быть автоматически обновлена. git pull: Удобен для частого обновления текущей ветки, когда вы уверены, что готовы к слиянию. Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем отличается stop от мока? 1. Stop (заглушка): имитирует поведение объекта, возвращая предопределённые данные, не содержат логики. 2. Mock (мок): это объект, проверяющий взаимодействие с ним, например, вызовы методов, их параметры и порядок. Ставь 👍 и забирай 📚 Базу знаний

15 лет в искусстве дизайна интерьеров В честь дня рождения хотим порадовать спецпредложениями на ведущие европейские бренды м
15 лет в искусстве дизайна интерьеров В честь дня рождения хотим порадовать спецпредложениями на ведущие европейские бренды мебели, света, кухонь. Приезжайте! Перейти на сайт #реклама twinstore.ru О рекламодателе

🤔 Какие бывают области видимости? Область видимости (или видимость) определяет, где в коде можно получить доступ к переменным, функциям и другим объектам. В 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. 🟠Публичная область видимости Свойства и методы доступны отовсюду. 🟠Защищённая область видимости Свойства и методы доступны только внутри класса и его наследников. 🟠Приватная область видимости Свойства и методы доступны только внутри класса, в котором они объявлены. Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем composer.json отличается от composer.lock? 1. composer.json: содержит список зависимостей проекта и их версии (диапазоны). 2. composer.lock: фиксирует конкретные версии зависимостей, установленных в проекте, для воспроизводимого окружения. Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем ставится всегда цель теста ? Цель тестирования всегда заключается в том, чтобы выявить ошибки, дефекты и недостатки в программном обеспечении до того, как оно будет выпущено или внедрено. Тестирование помогает убедиться, что программа работает правильно, соответствует требованиям и ожиданиям пользователей, а также обеспечивает высокое качество и надежность продукта. 🚩Основные цели 🟠Выявление ошибок и дефектов Найти и исправить ошибки, которые могли возникнуть в ходе разработки. Это помогает предотвратить сбои в работе программы. 🟠Подтверждение соответствия требованиям Убедиться, что программное обеспечение соответствует заданным требованиям и спецификациям. Это включает проверку функциональности, производительности, безопасности и других аспектов. 🟠Повышение качества продукта Тестирование помогает улучшить общее качество программного обеспечения, делая его более стабильным, надежным и удобным в использовании. 🟠Обеспечение пользовательского опыта Убедиться, что конечные пользователи получат продукт, который удовлетворяет их потребности и ожидания, обеспечивая тем самым положительный пользовательский опыт. 🚩Типы 🟠Функциональное тестирование Проверка того, что каждый компонент системы работает в соответствии с требованиями. 🟠Нефункциональное тестирование Проверка аспектов, не связанных напрямую с функциональностью, таких как производительность, безопасность, удобство использования и т.д. 🟠Юнит-тестирование Тестирование отдельных компонентов или модулей кода. 🟠Интеграционное тестирование Проверка взаимодействия между различными модулями или компонентами системы. 🟠Системное тестирование Полная проверка всей системы в целом. 🟠Приемочное тестирование Проверка системы на соответствие бизнес-требованиям и готовность к использованию конечными пользователями.
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase {
    public function testAdd() {
        $calc = new Calculator();
        $this->assertEquals(4, $calc->add(2, 2));
        $this->assertEquals(0, $calc->add(-1, 1));
    }
}

class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }
}
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Какие преимущества работы в Git'е видишь? Работа с Git предоставляет множество преимуществ для разработчиков и команд, что делает его одним из самых популярных систем контроля версий. ➕Поддержка распределённого контроля версий Локальные репозитории: Каждый имеет полную копию репозитория, включая всю его историю. Это означает, что можно работать оффлайн, выполнять коммиты и историю изменений, а затем синхронизировать с центральным репозиторием при подключении к интернету. Безопасность: Вся история проекта дублируется на каждом локальном репозитории, что обеспечивает защиту данных от потери. ➕Мощные функции ветвления и слияния Лёгкость создания веток: Ветки в нем создаются и управляются быстро и эффективно, что позволяет разработчикам работать над новыми функциями, исправлениями ошибок или экспериментами без влияния на основную ветку кода. Продвинутое слияние: Обеспечивает мощные инструменты для слияния изменений, минимизируя конфликты и облегчая интеграцию кода из разных веток. Отслеживание истории изменений Полная история изменений: Сохраняет все изменения, сделанные в проекте, включая метаданные о том, кто и когда внес изменения. Это позволяет отслеживать эволюцию проекта и возвращаться к предыдущим состояниям кода. Аннотации (blame): Функция git blame позволяет увидеть, кто внёс изменения в конкретную строку кода, что упрощает поиск и исправление ошибок. ➕Совместная работа и интеграция Совместная работа: Упрощает работу в команде, позволяя разработчикам работать параллельно над разными частями проекта. Ветки позволяют изолировать работу и облегчить интеграцию изменений. Интеграция с CI/CD: Легко интегрируется с системами непрерывной интеграции и доставки (CI/CD), что позволяет автоматизировать сборку, тестирование и развертывание приложений. ➕Высокая производительность Эффективное управление файлами: Оптимизирован для быстрого выполнения операций, таких как создание веток, коммитов и слияний. Он эффективно обрабатывает большие проекты с большим количеством файлов и историей изменений. Минимальное использование ресурсов: Локальные операции в нем выполняются быстро и не требуют подключения к сети, что ускоряет процесс разработки. ➕Гибкость и расширяемость Поддержка различных рабочих процессов: Поддерживает различные рабочие процессы и стратегии разработки, такие как GitFlow, Feature Branch Workflow и другие. Расширяемость: Большое количество доступных плагинов и инструментов позволяет адаптировать Git под конкретные нужды проекта или команды. ➕Прозрачность и аудит Прозрачность изменений: Все изменения и коммиты доступны для просмотра и аудита, что повышает прозрачность работы команды и облегчает управление проектом. Безопасность изменений: Возможность цифровой подписи коммитов и тегов добавляет уровень безопасности и доверия к изменениям в проекте. 🚩Примеры 🟠GitHub Платформа для хостинга и совместной работы над проектами, использующая Git. Она предоставляет инструменты для обзора кода, управления задачами и автоматизации CI/CD. 🟠GitLab Интегрированная платформа DevOps, которая объединяет функции Git-репозитория, CI/CD, мониторинга и безопасности. 🟠Bitbucket Сервис для хостинга репозиториев Git с интеграцией инструментов для управления проектами и CI/CD. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как устроен декоратор? Это функция или класс, который принимает объект (или функцию) и возвращает его с дополнительной функциональностью. 1. В Python декораторы оборачивают функцию с использованием @decorator. 2. Они могут изменять входные данные, добавлять поведение или обрабатывать результат функции. Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нужны паттерны проектирования? Это повторяемые решения типичных задач. Они помогают разработчикам создавать программы, которые легко поддерживать, расширять и модифицировать. Паттерны проектирования упрощают процесс разработки, обеспечивая проверенные способы решения распространенных проблем, что экономит время и силы разработчиков. 🚩Зачем они нужны 🟠Повторяемость и стандартность Паттерны обеспечивают повторяемость решений для часто возникающих задач, что снижает вероятность ошибок и улучшает читабельность кода. 🟠Улучшение коммуникации Использование общепринятых паттернов облегчает коммуникацию между разработчиками. Когда все понимают, что подразумевается под, например, «одиночкой» (singleton), это упрощает обсуждение архитектуры системы. 🟠Повышение качества кода Паттерны проектирования способствуют созданию более структурированного, гибкого и поддерживаемого кода. 🟠Экономия времени и ресурсов Паттерны позволяют не изобретать велосипед, а использовать проверенные решения, что ускоряет процесс разработки. 🚩Как они используются Паттерны проектирования делятся на несколько категорий, каждая из которых решает определенный тип задач: 🟠Порождающие паттерны Эти паттерны касаются создания объектов. Примеры: Singleton, Factory, Builder. 🟠Структурные паттерны Эти паттерны касаются построения структуры больших объектов. Примеры: Adapter, Composite, Decorator. 🟠Поведенческие паттерны Эти паттерны касаются взаимодействия и распределения обязанностей между объектами. Примеры: Observer, Strategy, Command.
class Singleton {
    private static $instance;

    private function __construct() {
        // Закрытый конструктор предотвращает создание объекта через new
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function someBusinessLogic() {
        // Некоторая бизнес-логика
    }
}

// Использование Singleton
$singleton = Singleton::getInstance();
$singleton->someBusinessLogic();
Ставь 👍 и забирай 📚 Базу знаний