PHP | Вопросы собесов
前往频道在 Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
显示更多2 341
订阅者
-224 小时
-57 天
-2330 天
帖子存档
🤔 Какие типы объединений есть в таблицах?
Существуют INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN и SELF JOIN. INNER JOIN возвращает только совпадающие записи, LEFT и RIGHT JOIN добавляют данные из одной таблицы даже при отсутствии совпадений. FULL JOIN объединяет данные обеих таблиц, а CROSS JOIN создает декартово произведение строк.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Обучение на Frontend-разработчика. С нуля за 9 месяцев.
На курсе вы получите все навыки, необходимые для старта в профессии Frontend-разработчика.
Персональный наставник middle/senior уровня.
14 проектов, лайвкодинг, хакатоны, репетиции техсобеседования.
Освоите JavaScript, React, TypeScript
Официальный диплом и сертификат школы.
Поддержка наставника по JS в течение 3-х месяцев после диплома.
Гарантия трудоустройства. Если вы не устроитесь, вернём деньги. Это закреплено в договоре п. 6.14
С 9 по 30 ноября 2024 г. скидка 40% на все программы Result School
Узнать больше
#реклама 16+
result.school
О рекламодателе
🤔 Что такое паттерн event sourcing, когда его нужно использовать?
Это паттерн проектирования, при котором все изменения состояния приложения сохраняются как последовательность неизменяемых событий. Вместо хранения текущего состояния объекта, приложение сохраняет каждое событие, которое изменило состояние объекта, и на основе этих событий может воссоздать текущее состояние.
🚩Основные принципы Event Sourcing
🟠Сохранение событий
Все изменения состояния приложения сохраняются как события. Эти события неизменяемы и добавляются в журнал событий (event log).
🟠Воспроизведение состояния
Текущее состояние объекта можно воспроизвести, проигрывая все события, относящиеся к этому объекту. Это позволяет легко воссоздавать состояние объекта на любой момент времени.
🟠Неизменяемость событий
События являются неизменяемыми. Если необходимо изменить состояние, создается новое событие.
🚩Пример использования Event Sourcing
Пример на Python. В этом примере все операции над счетом (
deposit, withdraw) сохраняются как события (Deposit, Withdrawal), и текущее состояние (balance) можно воспроизвести, проигрывая эти события.
class Account:
def __init__(self, id):
self.id = id
self.balance = 0
self.events = []
def apply(self, event):
if isinstance(event, Deposit):
self.balance += event.amount
elif isinstance(event, Withdrawal):
self.balance -= event.amount
self.events.append(event)
def deposit(self, amount):
self.apply(Deposit(self.id, amount))
def withdraw(self, amount):
self.apply(Withdrawal(self.id, amount))
class Deposit:
def __init__(self, account_id, amount):
self.account_id = account_id
self.amount = amount
class Withdrawal:
def __init__(self, account_id, amount):
self.account_id = account_id
self.amount = amount
# Использование
account = Account(1)
account.deposit(100)
account.withdraw(50)
print(account.balance) # Выведет: 50
🚩Когда использовать
🟠Аудит и история изменений
Event Sourcing полезен, когда необходимо сохранять полную историю изменений состояния для аудита или анализа. Пример: финансовые приложения, где важно сохранять все транзакции.
🟠Восстановление состояния
Когда необходимо восстановить состояние объекта на любой момент времени в прошлом. Пример: системы резервного копирования и восстановления данных.
🟠Асинхронные процессы
Для приложений с высокой степенью асинхронности, где события могут обрабатываться в различных сервисах. Пример: системы микросервисов, где каждое событие может инициировать действие в другом сервисе.
🟠Event-Driven Architecture (Событийно-ориентированная архитектура)
В архитектурах, где события являются основным способом взаимодействия между компонентами системы. Пример: системы с использованием очередей сообщений или потоков событий.
🚩Плюсы
➕Историчность
Полная история всех изменений.
➕Восстановление состояния
Возможность восстановления состояния на любой момент времени.
➕Производительность
Возможность оптимизации чтения данных с помощью проекций.
➕Гибкость
Возможность добавления новых бизнес-логик без изменения существующего состояния.
🚩Минусы
➖Сложность
Усложняет реализацию и требует дополнительного планирования.
➖Объем данных
Увеличение объема хранимых данных за счет хранения всех событий.
➖Консистентность
Необходимость управления консистентностью данных при распределенной обработке событий.
Ставь 👍 и забирай 📚 Базу знаний🤔 Какие технологии, инструменты используешь в работе
Использую инструменты и технологии для разработки, такие как Git для контроля версий, Docker для контейнеризации, CI/CD системы (например, Jenkins), а также IDE, подходящие для работы с разными языками (например, IntelliJ IDEA, Visual Studio Code). В веб-разработке применяю JavaScript, React, а в бэкенде — такие языки, как Python или Go, с базами данных PostgreSQL или MongoDB. Также использую тестовые библиотеки, такие как Jest или Pytest, для обеспечения качества кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
+9
Помощь в трудоустройстве в IT-сфере!
По всей России объявили бесплатную программу на шестимесячное обучение по IT-cпециальностям.
Запись на участие в программе продлится до конца июля, но чтобы туда попасть, нужно пройти специальный профтест.
По результату тестирования сразу узнаете, какая профессия вам подойдет, и проходите ли вы на бесплатное обучение.
Перейти на сайт
#реклама 16+
urban-university.ru
О рекламодателе
🤔 В чем разница между фабрикой и фабричным методом?
Это два распространенных паттерна проектирования в объектно-ориентированном программировании, которые помогают управлять созданием объектов. Они часто используются для инкапсуляции процесса создания объектов и для того, чтобы сделать код более гибким и поддерживаемым. Однако они отличаются друг от друга по своей реализации и применению.
🚩Фабрика (Factory)
Паттерн "Фабрика" (также известен как "Абстрактная фабрика" или "Simple Factory") представляет собой объект, который создаёт другие объекты. Обычно это делается с помощью одного или нескольких методов, которые возвращают экземпляры различных классов.
class Car {
// свойства и методы класса Car
}
class Truck {
// свойства и методы класса Truck
}
class VehicleFactory {
public static function createVehicle($type) {
if ($type === 'car') {
return new Car();
} elseif ($type === 'truck') {
return new Truck();
}
throw new Exception("Invalid vehicle type.");
}
}
// Использование фабрики
$car = VehicleFactory::createVehicle('car');
$truck = VehicleFactory::createVehicle('truck');
🚩Когда использовать
Когда вам нужно создать семейство связанных или зависимых объектов.
Когда процесс создания объектов сложный и требует логики, которую стоит инкапсулировать в одном месте.
🚩Фабричный метод (Factory Method)
Паттерн "Фабричный метод" (Factory Method) делегирует создание объектов подклассам. Он определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой именно класс инстанцировать. Таким образом, фабричный метод позволяет классам делегировать создание экземпляров другим классам.
abstract class Vehicle {
abstract public function drive();
}
class Car extends Vehicle {
public function drive() {
echo "Driving a car";
}
}
class Truck extends Vehicle {
public function drive() {
echo "Driving a truck";
}
}
abstract class VehicleFactory {
abstract public function createVehicle(): Vehicle;
public function doSomething() {
$vehicle = $this->createVehicle();
$vehicle->drive();
}
}
class CarFactory extends VehicleFactory {
public function createVehicle(): Vehicle {
return new Car();
}
}
class TruckFactory extends VehicleFactory {
public function createVehicle(): Vehicle {
return new Truck();
}
}
// Использование фабричных методов
$carFactory = new CarFactory();
$carFactory->doSomething(); // Выведет: Driving a car
$truckFactory = new TruckFactory();
$truckFactory->doSomething(); // Выведет: Driving a truck
🚩Основные различия
🟠Фокусировка на абстракции
Фабрика: Сосредоточена на создании объектов в одном центральном месте и, как правило, не использует наследование для расширения функциональности.
Фабричный метод: Сосредоточен на использовании наследования и полиморфизма для делегирования создания объектов подклассам.
🟠Структура кода
Фабрика: Имеет один центральный класс, который содержит методы для создания различных типов объектов.
Фабричный метод: Определяет метод в базовом классе или интерфейсе, который реализуется в подклассах для создания конкретных объектов.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое полиморфизм
Полиморфизм — это возможность использовать один и тот же метод или операцию для объектов разных классов, обрабатывая их по-разному. Он бывает двух типов: полиморфизм подтипов (через наследование) и параметрический полиморфизм (через дженерики). Полиморфизм помогает реализовать более универсальные и расширяемые программы, позволяя объектам работать с кодом через интерфейсы и абстрактные классы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Запустите рекламу в телеграм-каналах с Яндекс Директом
Перфоманс-реклама теперь в телеграм-каналах ⚡
Яндекс Директ знает, как привлечь целевую аудиторию 💰👌
Попробовать
#реклама
yandex.ru
О рекламодателе
🤔 Какими бывают форматы запросов и ответов приложения?
Форматы запросов и ответов приложения являются основополагающими компонентами взаимодействия между клиентом и сервером в веб-приложениях.
🚩Форматы
🟠GET
Используется для получения данных с сервера.
GET /api/users?name=John
Когда нужно получить данные без изменения состояния сервера.
🟠POST
Используется для отправки данных на сервер для создания или обновления ресурса.
Когда нужно создать новый ресурс или обновить существующий.
POST /api/users
Content-Type: application/json
{
"name": "John",
"email": "john@example.com"
}
🟠PUT
Используется для обновления ресурса на сервере.
Когда нужно обновить существующий ресурс целиком.
PUT /api/users/1
Content-Type: application/json
{
"name": "John Updated",
"email": "john_updated@example.com"
}
🟠PATCH
Используется для частичного обновления ресурса.
Когда нужно обновить часть ресурса.
PATCH /api/users/1
Content-Type: application/json
{
"email": "john_new@example.com"
}
🟠DELETE
Используется для удаления ресурса с сервера.
DELETE /api/users/1
Когда нужно удалить ресурс.
🚩Форматы ответов
🟠HTML
Ответ в виде HTML-кода.
<html><body><h1>User Profile</h1></body></html>
Для отображения веб-страниц в браузере.
🟠JSON
Легковесный формат обмена данными, удобный для передачи данных между клиентом и сервером.
Широко используется в RESTful API.
{
"id": 1,
"name": "John",
"email": "john@example.com"
}
🟠XML
Расширяемый язык разметки, используемый для обмена данными.
Ранее широко использовался в веб-сервисах, сейчас реже.
<user>
<id>1</id>
<name>John</name>
<email>john@example.com</email>
</user>
🟠Plain Text
Обычный текст без разметки.
User created successfully
Для простых ответов, где не требуется структура данных.
🟠File Formats (например, CSV, PDF)
Ответ в виде файлов различных форматов.
Отправка отчетов в виде PDF или данных в виде CSV.
Когда нужно предоставить данные в формате файла.
🚩Пример использования
header('Content-Type: application/json');
$response = [
'id' => 1,
'name' => 'John',
'email' => 'john@example.com'
];
echo json_encode($response);
Ставь 👍 и забирай 📚 Базу знаний🤔 Расскажи про полиморфизм
Полиморфизм — это концепция ООП, которая позволяет объектам разных классов обрабатывать одинаковые сообщения или методы по-разному. Полиморфизм позволяет использовать общий интерфейс для взаимодействия с объектами разных типов, не зная их конкретный класс. Он облегчает расширение и поддержку кода, делая его более гибким и удобным для добавления новых классов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Чем пул пуш отличается от пап сап?
"PULL" и "PUSH" в контексте архитектурных стилей и шаблонов проектирования системы, а также "PAP" и "SAP" как термины, не имеют стандартных общепринятых определений в информатике. Тем не менее, можно сделать обоснованные предположения и разъяснения.
🚩PULL vs. PUSH
🟠PULL (Запрос данных клиентом)
Клиент инициирует запрос к серверу для получения данных. Клиент запрашивает веб-страницу из браузера. Приложение обращается к API для получения информации.
🟠PUSH (Отправка данных сервером)
Сервер инициирует отправку данных клиенту без явного запроса со стороны клиента. Уведомления в реальном времени (например, через WebSockets). Уведомления по электронной почте или SMS.
🚩Примеры реализации PULL и PUSH
PULL
// Пример PULL: Запрос данных через API
function fetchData($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
$data = fetchData('https://api.example.com/data');
print_r($data);
PUSH
// Пример PUSH: Отправка данных через WebSocket
require 'vendor/autoload.php';
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class PushServer implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
$server = IoServer::factory(
new HttpServer(
new WsServer(
new PushServer()
)
),
8080
);
$server->run();
🚩PAP и SAP
Что касается терминов "PAP" и "SAP", если это опечатки или аббревиатуры, не относящиеся к стандартным терминам в программировании, то тут сложно дать точное определение. Однако, в некоторых контекстах они могут быть связаны с различными концепциями.
🟠PAP (Policy Administration Point)
Обычно используется в контексте управления доступом и безопасности, представляя собой точку управления политиками безопасности в системах контроля доступа.
🟠SAP (Session Announcement Protocol)
Протокол, используемый для объявления сеансов в сетях мультимедиа.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое динамическая типизация
Динамическая типизация — это свойство языка программирования, где тип переменной определяется во время выполнения, а не во время компиляции. Это позволяет использовать одну переменную для хранения данных разных типов, упрощая код, но также увеличивая вероятность ошибок, так как проверки типов происходят в процессе выполнения. Языки с динамической типизацией, такие как Python и JavaScript, предлагают большую гибкость, но требуют внимательности при работе с типами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Dockerе?
Для ускорения развертывания приложений в Docker существует несколько методов и практик, которые помогают оптимизировать сборку и запуск контейнеров. Вот некоторые из них:
🚩Оптимизация Dockerfile
🟠Меньше слоев
Каждая инструкция в Dockerfile создает новый слой в образе. Старайтесь минимизировать количество слоев, объединяя инструкции, где это возможно.
# Плохо
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y vim
# Хорошо
RUN apt-get update && \
apt-get install -y curl vim
🟠Использование правильного базового образа
Выберите наиболее подходящий базовый образ, который минимально необходим для вашего приложения. Использование минималистичных образов, таких как alpine, может существенно уменьшить размер образа.
FROM php:7.4-fpm-alpine
🟠Кэширование зависимостей
Сначала копируйте файлы с зависимостями (например, composer.json, package.json) и устанавливайте их, а затем копируйте остальной код. Это позволит Docker использовать кэш на этапе установки зависимостей, если они не изменились.
FROM php:7.4-fpm-alpine
# Установка зависимостей
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
# Копирование кода
COPY . /app
🟠Использование многоступенчатой сборки
Многоступенчатая сборка позволяет собирать и тестировать ваше приложение в одном этапе и копировать только необходимые файлы в финальный образ, что уменьшает размер финального образа.
# Сборочный этап
FROM composer:latest AS builder
WORKDIR /app
COPY composer.json composer.lock /app/
RUN composer install --no-dev --optimize-autoloader
# Финальный этап
FROM php:7.4-fpm-alpine
WORKDIR /app
COPY --from=builder /app /app
COPY . /app
🟠Использование кэша сборки
При разработке используйте кэш Docker для ускорения сборки. Для этого нужно правильно организовать порядок инструкций в Dockerfile, чтобы неизменные части использовали кэш.
🟠Оптимизация Docker Compose
Если вы используете Docker Compose, убедитесь, что сервисы поднимаются параллельно и что вы используете возможность кэширования сборок.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
ports:
- "3306:3306"
🟠Использование кэшированных слоев и промежуточных образов
При частых изменениях кода старайтесь кэшировать слои, которые не меняются, и использовать промежуточные образы для ускорения сборки.
# Использование промежуточного образа
FROM php:7.4-fpm-alpine AS base
COPY . /app
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
FROM base AS dev
RUN apk add --no-cache bash
CMD ["php-fpm"]
FROM base AS prod
CMD ["php-fpm"]
🟠Использование готовых образов для разработки
Используйте готовые образы, где уже установлены все необходимые зависимости для разработки, что сократит время сборки образов.
🟠Параллельная сборка и запуск
Используйте параллельную сборку и запуск контейнеров, если это возможно. Docker Compose поддерживает параллельный запуск, что может значительно ускорить процесс развертывания.
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое статическое связывание?
Статическое связывание — это процесс, при котором компилятор определяет привязку метода или переменной к конкретному типу во время компиляции, а не выполнения. В основном, статическое связывание происходит для статических методов, переменных и перегруженных методов (не путать с переопределением), где точный тип известен заранее. Это связывание быстрее, чем динамическое, поскольку не требует дополнительных проверок в процессе выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как устроен генератор на PHP?
Это удобный инструмент для создания итераторов в простом и лаконичном виде. Они позволяют создавать функции, которые могут приостанавливать и возобновлять своё выполнение, возвращая промежуточные значения. Это особенно полезно для работы с большими наборами данных или бесконечными последовательностями, где хранение всех значений в памяти одновременно нецелесообразно.
🚩Как работает
Генераторы в PHP реализуются с помощью ключевого слова
yield. Когда функция-генератор вызывает yield, она приостанавливает своё выполнение и возвращает значение, пока не будет вызвана снова. В отличие от обычных функций, генераторы могут возвращать значения несколько раз в процессе выполнения.
🚩Основные принципы работы
🟠Создание генератора
Генератор определяется как обычная функция, но использует ключевое слово yield для возврата значений.
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
🟠Итерация по значениям генератора
Функция-генератор возвращает объект класса Generator, который реализует интерфейс Iterator.
foreach (myGenerator() as $value) {
echo $value . PHP_EOL;
}
// Выведет:
// 1
// 2
// 3
🟠Использование `yield` с ключами
Генератор может возвращать ключи и значения, как в ассоциативных массивах.
function keyValueGenerator() {
yield 'a' => 1;
yield 'b' => 2;
yield 'c' => 3;
}
foreach (keyValueGenerator() as $key => $value) {
echo "$key => $value" . PHP_EOL;
}
// Выведет:
// a => 1
// b => 2
// c => 3
🟠Приостановка и возобновление генератора
Каждый вызов yield приостанавливает выполнение генератора, сохраняя его текущее состояние. Когда выполнение генератора возобновляется, оно продолжается с того места, где было приостановлено.
function countToTen() {
for ($i = 1; $i <= 10; $i++) {
yield $i;
}
}
$generator = countToTen();
foreach ($generator as $value) {
echo $value . PHP_EOL;
}
// Выведет числа от 1 до 10
🚩Плюсы
➕Эффективное использование памяти
Генераторы создают значения по мере необходимости, что позволяет экономить память при работе с большими наборами данных.
➕Простота и лаконичность кода
Генераторы позволяют создавать итераторы без необходимости реализации интерфейса Iterator вручную, что упрощает код и делает его более читаемым.
➕Обработка больших данных
Генераторы идеальны для работы с большими наборами данных, файлами, базами данных или бесконечными последовательностями, где хранение всех данных в памяти одновременно невозможно или неэффективно.
🚩Пример использования
function readLargeFile($filePath) {
$file = fopen($filePath, 'r');
if (!$file) {
throw new Exception("Cannot open file: $filePath");
}
try {
while (($line = fgets($file)) !== false) {
yield $line;
}
} finally {
fclose($file);
}
}
// Использование генератора для обработки строк файла
foreach (readLargeFile('large_file.txt') as $line) {
echo $line;
}
Ставь 👍 и забирай 📚 Базу знаний🤔 Разница между merge и rebase
`Merge` и `Rebase` — это команды в Git для объединения веток, но работают они по-разному. `Merge` создает новый коммит слияния, сохраняя историю обеих веток, что может привести к разветвленной истории. `Rebase` переписывает историю, перенося коммиты текущей ветки на вершину другой, делая историю линейной и более чистой, но с потенциальными рисками для уже опубликованного кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Как IT-компании увеличить продажи с помощью вебинаров?
Делимся гайдом для маркетологов IT-компаний с рекомендациями ведущих российских разработчиков и экспертов МТС Линк.
Вы узнаете:
- Как правильно использовать онлайн-мероприятия для продвижения;
- Как собрать 5 000 потенциальных клиентов из любой точки мира в одном месте;
- Как увеличить узнаваемость бренда и создать комьюнити вокруг него;
- Как оценить вклад онлайн-мероприятия в продвижение компании и правильно обработать лиды;
Получите методичку бесплатно на сайте!
Скачать
#реклама 16+
mts-link.ru
О рекламодателе
🤔 Какое покрытие тестами является нормальным?
Покрытие тестами (test coverage) измеряет, какая часть вашего кода была выполнена во время тестирования. Это один из показателей качества тестирования, но не единственный. Вопрос о том, какое покрытие тестами является "нормальным", зависит от контекста, типа приложения и требований к качеству.
🚩Общие рекомендации
🟠Минимальное покрытие
30-50%: Для многих проектов, особенно для небольших или менее критичных, считается приемлемым начальным уровнем. Это может охватывать основные функциональные компоненты и критически важные пути кода.
🟠Среднее покрытие
70-80%: Это хороший целевой показатель для большинства коммерческих приложений. Он обеспечивает достаточно уверенности в том, что основная логика и ключевые функциональные области протестированы.
🟠Высокое покрытие
90-100%: Идеально, но часто трудно достижимо и поддерживаемо. Высокое покрытие желательно для критически важных систем, где ошибки могут иметь серьезные последствия (например, в медицинских, финансовых или авиационных системах).
🚩Почему 100% покрытие тестами не всегда целесообразно
🟠Затраты и время
Достижение 100% покрытия может потребовать значительных усилий и времени, что не всегда оправдано.
🟠Поддержка тестов
Поддержание тестов в актуальном состоянии при изменениях в коде может быть трудоемким.
🟠Ложное чувство безопасности
Высокое покрытие не гарантирует отсутствие ошибок. Например, тесты могут быть некачественными или не охватывать реальные сценарии использования.
🟠Сложные или неважные участки кода
Некоторые части кода могут быть сложными для тестирования или не иметь значительного влияния на основную функциональность приложения.
🚩Стратегии для достижения оптимального покрытия
🟠Риск-ориентированное тестирование
Сосредоточьте усилия на тех частях кода, которые имеют наибольшее значение для стабильности и безопасности системы.
🟠Модульное тестирование (Unit Testing)
Тестируйте отдельные функции или методы для обеспечения их корректной работы.
🟠Интеграционное тестирование (Integration Testing)
Проверяйте взаимодействие между различными модулями или компонентами.
🟠Функциональное тестирование (Functional Testing)
Убедитесь, что приложение выполняет свои функции согласно спецификации.
🟠Тестирование на основе сценариев (Scenario-based Testing)
Используйте реальные сценарии использования для проверки корректности работы системы.
🚩Инструменты для измерения покрытия тестами
🟠PHPUnit
Широко используемый фреймворк для тестирования PHP-кода, поддерживающий генерацию отчетов о покрытии.
🟠Xdebug
Мощный инструмент для профилирования и анализа покрытия кода.
🟠php-code-coverage
Библиотека для сбора и представления данных о покрытии тестами.
🚩Пример использования
Установка Xdebug и PHPUnit
pecl install xdebug
composer require --dev phpunit/phpunit
Конфигурация PHPUnit (phpunit.xml)
<phpunit>
<logging>
<log type="coverage-html" target="coverage" />
</logging>
</phpunit>
Запуск тестов с генерацией отчета о покрытии
phpunit --coverage-html coverage
Ставь 👍 и забирай 📚 Базу знанийRepost from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.
HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.
Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.
Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен.
Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.
О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
🤔 Нововведения в PHP 8
1. JIT компиляция: Улучшает производительность за счет компиляции кода на лету.
2. Named Arguments: Позволяют передавать аргументы по имени, улучшая читаемость кода.
3. Attributes: Метаданные в виде аннотаций для классов и функций.
4. Union Types: Поддержка объединения нескольких типов для одной переменной.
5. Match Expressions: Выражение, подобное switch, но с возможностью возвращения значения.
6. Constructor Property Promotion: Сокращает код за счет объявления и инициализации свойств в конструкторе.
7. Nullsafe Operator: Упрощает работу с null, позволяя вызывать методы/свойства объектов, которые могут быть null.
8. Weak Maps: Поддержка коллекций с автоматическим управлением памятью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
