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

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

Ir al canal en Telegram

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

Mostrar más
2 346
Suscriptores
Sin datos24 horas
-37 días
-2430 días
Archivo de publicaciones
🤔 Зачем нужны паттерны проектирования? Паттерны проектирования решают типичные задачи разработки, предоставляя проверенные временем решения. Они повышают читаемость, повторное использование и масштабируемость кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое транзакции? Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка. 🟠Atomicity (Атомарность) Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;    
🟠Consistency (Согласованность) Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям. 🟠Isolation (Изолированность) Обеспечивает изолированность транзакций друг от друга. Это означает, что результаты промежуточных операций одной транзакции невидимы для других транзакций до завершения первой транзакции. 🟠Durability (Долговечность) Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы. 🚩Использования транзакций 🟠Перевод денег между счетами Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

COMMIT; -- Если обе операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка    
🟠Создание заказа в интернет-магазине Важно убедиться, что все связанные операции (добавление записи о заказе, обновление статуса товаров, запись данных о платеже) выполнены успешно.
BEGIN TRANSACTION;

INSERT INTO orders (user_id, order_date) VALUES (1, NOW());
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO payments (order_id, amount) VALUES (LAST_INSERT_ID(), 99.99);

COMMIT; -- Если все операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка
Ставь 👍 и забирай 📚 Базу знаний

🤔 Имеет ли значение регистр заголовка? Нет, не имеет. В HTTP заголовки регистронезависимы. Например, Content-Type, content-type, CONTENT-TYPE — это одно и то же. Но значения заголовков могут быть чувствительны к регистру — зависит от конкретного поля. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что известно о MVC? Это паттерн проектирования, широко используемый для создания структурированных и масштабируемых приложений. Он разделяет приложение на три основных компонента: Модель (Model), Представление (View) и Контроллер (Controller). 🚩Основные компоненты 🟠Модель (Model) Модель отвечает за данные и бизнес-логику приложения. Она управляет доступом к данным, логикой их обработки и взаимодействием с базой данных. В приложении электронной коммерции модель будет содержать классы, представляющие продукты, пользователей и заказы, а также методы для работы с этими данными (например, добавление нового продукта, обработка заказа и т.д.). 🟠Представление (View) Представление отвечает за отображение данных пользователю. Оно формирует пользовательский интерфейс на основе данных, предоставляемых моделью. Веб-страницы, отображающие список продуктов, форму регистрации или страницу заказа, являются примерами представлений. 🟠Контроллер (Controller) Контроллер действует как посредник между моделью и представлением. Он обрабатывает входные данные от пользователя, взаимодействует с моделью для выполнения необходимых операций и выбирает соответствующее представление для отображения результата. Контроллер может обрабатывать запрос на добавление нового продукта, получать данные от модели и затем отображать обновленный список продуктов через представление. 🚩Примеры Model
// app/Models/Product.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model {
    protected $fillable = ['name', 'price', 'description'];
}
Controller
// app/Http/Controllers/ProductController.php
namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller {
    public function index() {
        $products = Product::all();
        return view('products.index', compact('products'));
    }

    public function store(Request $request) {
        Product::create($request->all());
        return redirect()->route('products.index');
    }
}
View
<!-- resources/views/products/index.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>Products</title>
</head>
<body>
    <h1>Products</h1>
    <ul>
        @foreach($products as $product)
            <li>{{ $product->name }} - ${{ $product->price }}</li>
        @endforeach
    </ul>
    <form action="{{ route('products.store') }}" method="POST">
        @csrf
        <input type="text" name="name" placeholder="Product Name">
        <input type="text" name="price" placeholder="Product Price">
        <textarea name="description" placeholder="Product Description"></textarea>
        <button type="submit">Add Product</button>
    </form>
</body>
</html>
🚩ПлюсыРазделение обязанностей Разделяет приложение на три компонента, каждый из которых отвечает за свою задачу. Это упрощает поддержку и масштабирование кода. ➕Улучшенная тестируемость Разделение логики позволяет легко тестировать каждую часть приложения отдельно. ➕Гибкость и переиспользование Компоненты MVC могут быть легко изменены или переиспользованы в других частях приложения или в других проектах. ➕Чистота и упорядоченность кода Способствует созданию чистого и упорядоченного кода, что упрощает работу в команде и ускоряет разработку. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое DP (Dynamic Programming)? 1. Динамическое программирование — это метод оптимизации, используемый для решения задач, разбиваемых на подзадачи. 2. Результаты подзадач сохраняются и переиспользуются, чтобы избежать повторных вычислений. 3. Используется для задач оптимизации, например, нахождение кратчайшего пути, задачи Фибоначчи или задач на разбиение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое 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-контейнера. ➖Производительность В некоторых случаях может снижать производительность из-за необходимости разрешения зависимостей. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какое отличие у протоколов TCP и UDP? - TCP — надёжный, ориентирован на соединение: - Гарантирует доставку и порядок. - Используется для HTTP, FTP, SSH и т.п. - Медленнее из-за проверок, подтверждений, управления потоком. - UDP — ненадёжный, без соединения: - Быстрее, но без гарантии доставки и порядка. - Используется для видео/аудио-стриминга, игр, DNS, VoIP. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи о Unit tests Unit-тесты (или модульные тесты) — это тесты, которые проверяют работу отдельных модулей (функций, классов, методов) в коде. Они позволяют убедиться, что каждый компонент программы работает правильно в изоляции от других частей системы. 🚩Зачем нужны Unit-тесты? 🟠Раннее выявление ошибок тесты помогают обнаружить баги сразу после написания кода. 🟠Упрощение рефакторинга при изменении кода можно быстро проверить, не сломалось ли что-то. 🟠Уверенность в качестве кода тесты показывают, что функции работают так, как задумано. 🟠Автоматизация тестирования можно запускать тесты автоматически перед каждым релизом. 🟠Документирование кода тесты помогают понять, как должна работать функция. 🚩Как писать Unit-тесты в PHP? В PHP для написания тестов чаще всего используют PHPUnit – это популярный фреймворк для модульного тестирования. Устанавливаем через Composer:
composer require --dev phpunit/phpunit
🚩Пример Unit-теста Допустим, у нас есть функция в классе Calculator, которая складывает два числа
class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }
}
Теперь создадим тест для проверки работы метода add
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase {
    public function testAdd() {
        $calc = new Calculator();
        $result = $calc->add(2, 3);
        $this->assertEquals(5, $result);
    }
}
🚩Запуск тестов Чтобы запустить тест, используем команду
vendor/bin/phpunit tests
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Что такое нормализация, денормализация? Это два подхода к проектированию структуры баз данных. Они используются для оптимизации хранения данных и повышения производительности запросов. 🚩Нормализация Это процесс структурирования базы данных для уменьшения избыточности данных и устранения аномалий при обновлении, вставке или удалении данных. 🚩Цели нормализации 🟠Устранение дублирования данных Это помогает экономить место и поддерживать согласованность данных. 🟠Повышение целостности данных Например, если данные изменяются в одном месте, то изменения не нужно делать в других местах. 🚩Этапы нормализации 1⃣Первая нормальная форма (1NF) Удаление повторяющихся групп и дублирующихся данных. 2⃣Вторая нормальная форма (2NF) Устранение частичной зависимости данных от составного ключа. 3⃣Третья нормальная форма (3NF) Устранение транзитивной зависимости (когда данные зависят не от первичного ключа напрямую, а через другие поля). 4⃣Далее BCNF (нормальная форма Бойса-Кодда) и другие более сложные формы. 🚩Денормализация Это процесс намеренного добавления избыточности данных для повышения производительности запросов. 🚩Цели денормализации 🟠Ускорение чтения данных Объединение таблиц или добавление дублированных данных уменьшает количество соединений (JOIN) между таблицами.
SELECT o.OrderID, c.CustomerName, p.ProductName, p.ProductPrice
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN Products p ON o.ProductID = p.ProductID;
Ставь 👍 и забирай 📚 Базу знаний

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

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

Одним глазом заглянем к Яндекс Путешествиям чтобы ничего не забыть: они как раз к сезону подготовили целый сайт о поездке на
Одним глазом заглянем к Яндекс Путешествиям чтобы ничего не забыть: они как раз к сезону подготовили целый сайт о поездке на Ближний Восток. Там и что посмотреть, и что купить, и во что одеться, и где загорать, и на чём ездить. Забронировать #реклама 16+ special.travel.yandex.ru О рекламодателе

🤔 Что такое в мире PHP PSR и RFC? PSR (PHP Standards Recommendations) — это набор стандартов и рекомендаций для написания кода в PHP, таких как PSR-1, PSR-2 для стиля кода, PSR-4 для автозагрузки классов. RFC (Request for Comments) — это предложения по улучшению PHP, которые обсуждаются и принимаются сообществом, формируя новые возможности и изменения в языке. Оба механизма способствуют стандартизации и улучшению качества кода в PHP-сообществе. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое абстрактный класс? Абстрактный класс — это класс в ООП, который не может быть инстанциирован напрямую, то есть нельзя создать объект абстрактного класса используя оператор new. Они предназначены для того, чтобы служить базой для других классов, которые должны реализовать определенные методы, заданные в нем. Обеспечение общего определения класса, которое может быть использовано в качестве основы для создания производных классов. Производные классы должны реализовать все абстрактные методы абстрактного родительского класса, но при этом они могут также иметь дополнительные методы и свойства или переопределять существующие.
abstract class Животное {
    public function ест() {
        echo "Это животное ест";
    }

    abstract public function издаетЗвук();
}

class Собака extends Животное {
    public function издаетЗвук() {
        echo "Гав";
    }
}

// $животное = new Животное(); // Ошибка: нельзя инстанциировать абстрактный класс
$собака = new Собака();
$собака->ест(); // Вывод: Это животное ест
$собака->издаетЗвук(); // Вывод: Гав
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что изменилось в приведении типов в PHP 8? PHP 8 усилил строгую типизацию, добавив поддержку объединённых типов (Union Types). Также введены типы mixed и static, расширяющие возможности определения данных. Улучшена работа с привидением типов, исключая двусмысленности, чтобы снизить вероятность ошибок. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Где мы делаем фильтрацию данных? Фильтрацию данных в PHP можно делать в нескольких местах в зависимости от контекста. Основные области фильтрации: 🚩Фильтрация входных данных Когда мы получаем данные от пользователя ($_GET, $_POST, $_REQUEST), важно очищать их от нежелательных значений.
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
Фильтрация массива $_POST через filter_var_array()
$filters = [
    'name'  => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age'   => FILTER_VALIDATE_INT
];
$filteredData = filter_var_array($_POST, $filters);
🚩Фильтрация перед сохранением в базу данных Перед вставкой в SQL важно удалять потенциально опасные символы, чтобы избежать SQL-инъекций.
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
    ':name'  => htmlspecialchars($_POST['name']),
    ':email' => $_POST['email']
]);
🚩Фильтрация данных внутри кода Если данные поступают из разных источников, мы можем использовать фильтрующие функции PHP: Очистка строки от HTML
$cleanText = strip_tags("<h1>Hello</h1>"); // "Hello"
Удаление пробелов
$trimmed = trim("   example   "); // "example"
Приведение к числу
$number = filter_var("42abc", FILTER_SANITIZE_NUMBER_INT); // 42
🚩Фильтрация перед выводом (защита от XSS) Перед выводом в браузер очищаем данные от HTML/JS-кода, чтобы злоумышленник не внедрил скрипты.
echo htmlspecialchars("<script>alert('Hacked!')</script>"); 
// Выведет: &lt;script&gt;alert('Hacked!')&lt;/script&gt;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем отличается BacktimeTable от Backtime? 1. BacktimeTable может быть структурой данных или таблицей, используемой для хранения промежуточных результатов в задаче обратного отсчёта или обработки данных. 2. Backtime часто означает сам процесс обратного отсчёта или времени ожидания. 3. Различие зависит от контекста: таблица — для хранения, backtime — для логики. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Устали делать уроки вместе с ребенком? Мамы и папы! Надоели тройки, невнимательность и отказы от учебы? Шамиль Ахмадуллин — с
Устали делать уроки вместе с ребенком? Мамы и папы! Надоели тройки, невнимательность и отказы от учебы? Шамиль Ахмадуллин — создатель 70+ школ, помог 200 000+ семей — делится проверенными методами! Бесплатный 5-дневный марафон от Шамиля Ахмадуллина День 1: Супер-внимание за 15 минут ежедневно День 2: Лучшие нейроупражнения от СДВГ — концентрация на 100%! День 3: От "3" к "5" без скандалов и принуждения День 4: Как выстроить процесс обучения на учебный год, чтобы ребенку было легко и интересно учиться? День 5: Пошаговый план как помочь ребенку научиться учиться самостоятельно Итог: Школьник 11+ лет станет внимательным, самостоятельным и отличником! Тысячи родителей уже добились успеха. Бесплатная регистрация! Места заканчиваются! Перейти на сайт #реклама 16+ shamil-edu.ru О рекламодателе

🤔 Что такое декремент? декремент — это операция, используемые для увеличения или уменьшения значения переменной на единицу соответственно. 🚩Декремент Оператор уменьшает значение переменной на единицу. Он представлен двумя минусами (--). Так же, как и инкремент, декремент бывает двух видов: 🟠Префиксный декремент (`--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
?>
Ставь 👍 и забирай 📚 Базу знаний