PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.44K subscribers
30 photos
1.08K links
Download Telegram
🤔 Какой принцип нарушает Active Record?

Это популярный шаблон проектирования, который используется для взаимодействия с базой данных. Он сочетает в себе логику бизнес-модели и работу с базой данных в одном объекте. Несмотря на свою популярность и удобство, Active Record нарушает принцип разделения ответственности (Single Responsibility Principle, SRP) из SOLID.

🚩Почему Active Record нарушает SRP?

SRP гласит, что класс должен иметь только одну причину для изменения, то есть заниматься только одной задачей.
🟠Логика бизнес-модели
Класс хранит правила и поведение, связанные с сущностью (например, вычисления, валидации, связи).
🟠Работа с базой данных
Класс отвечает за взаимодействие с базой данных, включая CRUD-операции (создание, чтение, обновление, удаление), построение SQL-запросов и т. д.

Таким образом, Active Record совмещает две разные ответственности: бизнес-логику и взаимодействие с базой данных. Если изменится структура базы данных или логика обработки данных, класс придется менять, что нарушает SRP.
class User extends ActiveRecord {
public function getFullName() {
return $this->first_name . ' ' . $this->last_name;
}

public function saveUser() {
$this->save(); // Метод сохранения в базе данных
}
}


🚩Альтернатива

Чтобы соблюсти SRP, можно разделить бизнес-логику и работу с базой данных на разные уровни:
🟠Data Mapper
Отвечает только за преобразование данных между объектами и базой данных.
🟠Сервисы
Обрабатывают бизнес-логику.

class User {
private $firstName;
private $lastName;

public function __construct($firstName, $lastName) {
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function getFullName() {
return $this->firstName . ' ' . $this->lastName;
}
}

class UserMapper {
public function save(User $user) {
// SQL-запрос для сохранения данных
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Есть ли какое-то различие между одинарными и двойными кавычками?

- В большинстве языков программирования разницы нет.
- В PHP двойные кавычки позволяют интерполировать переменные, а одинарные – нет.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что такое Cookies в PHP?

Cookies (Куки) – это небольшие файлы, которые браузер сохраняет на компьютере пользователя и отправляет серверу при каждом запросе.

🚩Как работают Cookies?

Установка Cookie в PHP
setcookie("username", "Alice", time() + 3600, "/");


Чтение Cookie в PHP
echo $_COOKIE["username"]; //  Alice


Удаление Cookie
setcookie("username", "", time() - 3600, "/");


🚩Где используются Cookies?

Авторизация (сохранение логина).
Запоминание настроек (тема, язык).
Корзина товаров (если нет сессий).
Отслеживание пользователей (Google Analytics, реклама).

🚩Ограничения и безопасность Cookies

Максимальный размер – 4KB (поэтому для больших данных лучше использовать SESSION).
Можно изменить в браузере (поэтому не храните пароли в куках!).
Уязвимость XSS → если сайт подвержен XSS-атакам, злоумышленник может украсть куки.
Защита Cookies
setcookie("secure_cookie", "value", time() + 3600, "/", "", true, true);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Для чего предназначены форматы запросов и ответов приложения?

Форматы запросов и ответов обеспечивают обмен данными между клиентом и сервером.
Популярные форматы:
- JSON – компактный, удобный для API.
- XML – читаемый, часто используется в SOAP.
- YAML – удобен для конфигураций.
- Protobuf – бинарный, эффективный для высоконагруженных систем.
Форматы обеспечивают унифицированное взаимодействие между различными сервисами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Что такое namespaces?

Это механизм, позволяющий организовать код в логические группы и избежать конфликтов имен, особенно в больших проектах или при использовании сторонних библиотек.

🚩Зачем они нужны?

🟠Избежание конфликтов имен
В больших проектах могут быть сотни классов, функций и констант. Пространства имен помогают избежать ситуаций, когда разные части кода используют одинаковые имена.

🟠Упрощение организации кода
Они позволяют группировать связанные классы, интерфейсы, функции и константы, что делает код более читаемым и поддерживаемым.

🟠Упрощение автозагрузки
Пространства имен облегчают использование автозагрузчиков, таких как PSR-4, где классы и файлы организованы в соответствии с их пространствами имен.

🚩Как их использовать?

Для использования пространств имен, нужно объявить их в начале файла с помощью ключевого слова namespace.
<?php
namespace MyProject\Models;

class User {
public function getName() {
return "John Doe";
}
}
?>

Теперь класс User находится в пространстве имен MyProject\Models. Чтобы использовать этот класс в другом файле, нужно указать его полное имя:
<?php
require 'User.php';

$user = new \MyProject\Models\User();
echo $user->getName();
?>

Можно также использовать ключевое слово use для упрощения кода:
<?php
require 'User.php';

use MyProject\Models\User;

$user = new User();
echo $user->getName();
?>

Пространства имен могут содержать не только классы, но и функции и константы:
<?php
namespace MyProject\Utils;

const PI = 3.14;

function calculateCircleArea($radius) {
return PI * $radius * $radius;
}
?>

Использование этих элементов будет аналогичным:
<?php
require 'Utils.php';

echo \MyProject\Utils\calculateCircleArea(5);
echo \MyProject\Utils\PI;
?>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое списочный тип?

Это структура данных, представляющая упорядоченный набор элементов, где каждый элемент связан с предыдущим и следующим.
1. Пример — связанный список (linked list), где каждый узел содержит значение и ссылку на следующий узел.
2. Такие типы обеспечивают удобное добавление и удаление элементов, но имеют медленный доступ по индексу (O(n)).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
Новая фича на easyoffer Автоотлики

Вы автоматически откликаетесь на подходящие вам вакансии. Попробуйте её бесплатно и начните получать больше предложений о работе.

🚀 Запуск занимаем всего 3 минуты, а экономит очень много времени
🛡 Это безопасно: easyoffer официально одобрен HeadHunter и прошел его модерацию.
🥷🏻 Автоотклик незаметен для рекртера. Автоотклик ничем не отличается от обычного отклика, который вы делаете вручную

Рекрутеры давно используют автоматизацию для поиска кандидатов. Так почему вы должны откликаться вручную?

💡Совет – Добавьте шаблон сопроводительного письма, чтобы откликаться на большее количество вакансий (на некоторые вакансии нельзя откликнуться без сопроводительного)

Попробовать бесплатно → https://easyoffer.ru/autoapply
🤔 Зачем использовать Rest , если есть Soup?

SOAP (Simple Object Access Protocol) и REST (Representational State Transfer) – это два подхода для обмена данными между клиентом и сервером (API).

SOAP появился раньше, но REST стал более популярным, потому что он проще, быстрее и гибче.

🚩Почему REST лучше в большинстве случаев?

🟠REST проще и легче
SOAP использует сложные XML-сообщения с заголовками и схемами, что делает запросы более громоздкими.
REST использует JSON или XML, что делает его быстрее и удобнее.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getUser>
<id>123</id>
</getUser>
</soap:Body>
</soap:Envelope>


Пример запроса в REST (короче и проще)
GET /users/123 HTTP/1.1
Host: api.example.com


🟠REST быстрее и легче для веба
SOAP требует больше ресурсов, потому что использует XML + сложные заголовки.
REST работает по HTTP и использует JSON, который легче парсится в браузере и мобильных приложениях.

🟠REST лучше интегрируется с веб-технологиями
SOAP требует специальных библиотек (WSDL, WS-Security).
REST использует обычные HTTP-методы:
- GET – получить данные
- POST – создать
- PUT – обновить
- DELETE – удалить

🟠REST масштабируемый и кроссплатформенный
REST легко работает с JavaScript, мобильными приложениями (iOS, Android), браузерами и фронтендом.
SOAP чаще используется в корпоративных системах (банки, госструктуры), но хуже подходит для современных веб-приложений.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как устроен типичный тест на opening point?

Тест на Opening Point проверяет, корректно ли открывается доступ к ресурсу.
Он может включать:
- Авторизацию – доступ пользователя после входа.
- Перенаправления – корректный редирект при попытке входа.
- Доступность URL – проверка HTTP-ответа (например, 200 OK).
- Безопасность – отсутствие утечек при открытии ресурса.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое декремент?

декремент — это операция, используемые для увеличения или уменьшения значения переменной на единицу соответственно.

🚩Декремент

Оператор уменьшает значение переменной на единицу. Он представлен двумя минусами (--). Так же, как и инкремент, декремент бывает двух видов:

🟠Префиксный декремент (`--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
?>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое CQRS?

Это архитектурный паттерн, который разделяет операции чтения и записи на разные модели данных. Это улучшает производительность, масштабируемость и упрощает поддержку.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Для чего предназначены форматы запросов и ответов приложения?

Форматы запросов и ответов в приложении предназначены для стандартизированного обмена данными между клиентом (браузером, мобильным приложением) и сервером (PHP-приложением). Они позволяют:

Обеспечить совместимость между разными системами
Облегчить обработку данных на сервере и клиенте
Структурировать данные в удобном формате

🚩Форматы запросов (Request Formats)

Когда клиент отправляет запрос на сервер, данные могут передаваться разными способами.

🟠GET – передача данных через URL
Используется для получения информации. Данные передаются в строке запроса.
GET /api/users?id=10


Пример обработки в PHP
$id = $_GET['id']; // Получаем id из URL


🟠POST – передача данных в теле запроса
Используется для отправки данных (например, формы).
POST /api/users
Content-Type: application/json

{
"name": "Иван",
"email": "ivan@example.com"
}


Пример обработки в PHP
$data = json_decode(file_get_contents("php://input"), true);
echo "Имя: " . $data['name'];


🟠PUT, PATCH, DELETE – для обновления и удаления данных
Используются в REST API для изменения или удаления данных.

🚩Форматы ответов (Response Formats)

Сервер отправляет ответ в определённом формате, который клиент сможет распознать.

🟠JSON – самый популярный формат
Используется в API и веб-приложениях.
{
"status": "success",
"message": "Данные получены"
}


Пример ответа в PHP
header("Content-Type: application/json");
echo json_encode(["status" => "success", "message" => "Данные получены"]);


🟠XML – используется в старых системах
Пример XML-ответа
<response>
<status>success</status>
<message>Данные получены</message>
</response>


🟠HTML – если сервер возвращает веб-страницу
Например, при загрузке сайта.
echo "<h1>Привет, мир!</h1>";


🟠Текстовый формат (Plain Text)
Если нужен простой текст
header("Content-Type: text/plain");
echo "Привет, это просто текст!";


🚩Как сервер определяет формат ответа?
Сервер анализирует заголовок Accept в запросе:
Accept: application/json


PHP может обработать это так:
$accept = $_SERVER['HTTP_ACCEPT'];
if (strpos($accept, "application/json") !== false) {
header("Content-Type: application/json");
echo json_encode(["message" => "Привет, JSON!"]);
} else {
echo "Привет, обычный текст!";
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие структуры данных в программировании существуют?

Основные структуры:
- Линейные: массивы, списки, очереди, стеки.
- Нелинейные: деревья, графы.
- Ассоциативные: хеш-таблицы, словари.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое Docker?

Это платформа для разработки, доставки и запуска приложений в изолированных контейнерах. Она позволяет упаковывать приложения и все их зависимости в контейнеры, которые могут работать на любой системе, поддерживающей Docker, что делает приложения более переносимыми и независимыми от окружения.

🚩Основные концепции

🟠Контейнеры
Контейнеры — это легковесные, автономные, исполняемые пакеты, которые включают в себя все необходимое для запуска приложения: код, библиотеки, зависимости и системные инструменты. Контейнеры изолированы друг от друга и от хоста, что обеспечивает консистентность работы приложения в различных средах.

🟠Образы (Images)
Образ Docker — это неизменяемый шаблон, из которого создаются контейнеры. Образы могут базироваться на других образах и содержат все необходимое для запуска приложения. Например, образ может содержать операционную систему, веб-сервер и само приложение.

🟠Dockerfile
Dockerfile — это текстовый файл с инструкциями по созданию Docker-образа. Он содержит последовательность команд, которые Docker выполняет для сборки образа.
          # Используем базовый образ
FROM php:8.0-apache

# Копируем локальные файлы в контейнер
COPY src/ /var/www/html/

# Устанавливаем зависимости
RUN docker-php-ext-install mysqli


🟠Docker Hub
Docker Hub — это облачный сервис для хранения и обмена Docker-образами. Он позволяет публиковать свои образы и загружать образы, созданные другими пользователями.

🚩Плюсы

Портативность
Контейнеры могут работать на любом сервере, где установлен Docker, что позволяет легко перемещать приложения между различными средами (разработка, тестирование, продакшн).

Изоляция
Контейнеры изолируют приложения и их зависимости, предотвращая конфликты между различными версиями библиотек и инструментов, используемых на одном сервере.

Легковесность
Контейнеры используют общие ресурсы ядра хостовой операционной системы, что делает их более легковесными по сравнению с виртуальными машинами.

Быстрое развертывание
Контейнеры можно запускать и останавливать за считанные секунды, что ускоряет процессы разработки, тестирования и развертывания приложений.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Принципы ООП

Основные принципы объектно-ориентированного программирования включают инкапсуляцию (сокрытие деталей реализации), наследование (использование общих свойств и поведения базовых классов), полиморфизм (один интерфейс для разных типов данных) и абстракцию (определение шаблонного интерфейса для группы связанных объектов).?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как устроен типичный тест на opening point?

Тест на Opening Point (OP-тест) используется для проверки скорости, с которой игрок или программа находят критически важное первое решение в задаче. Такой тест чаще всего применяется в шахматах, игровых стратегиях, а также в программировании при оценке эвристик.

🚩Как устроен тест на Opening Point?

🟠Задаётся начальная позиция или состояние
Например, шахматная позиция, игровая ситуация или входные данные для алгоритма.

🟠Требуется найти оптимальный (или хороший) первый шаг
В шахматах это может быть лучший ход. В алгоритмах — первое удачное разбиение задачи.

🟠Замеряется время и корректность ответа
Важно, насколько быстро испытуемый (или программа) нашёл первый ход. Проверяется, соответствует ли он эталону (оптимальному решению).

🚩Пример из шахмат

В шахматах Opening Point тест оценивает, насколько быстро игрок или движок могут найти правильный ход в дебюте. Например:
> Позиция:
> 1. e4 e5
> 2. Nf3 Nc6
> 3. Bb5 a6
> 4. ?
Ожидаемый ход: Ba4 (Испанская партия).
Программа должна как можно быстрее выбрать этот ход, а тест фиксирует время поиска.

🚩Пример из программирования

Допустим, у нас есть массив чисел, и нужно быстро найти первый элемент, который удовлетворяет определённому условию.
function findOpeningPoint($arr, $condition) {
foreach ($arr as $item) {
if ($condition($item)) {
return $item;
}
}
return null; // Если не найдено
}

$array = [1, 3, 7, 10, 15];
$condition = fn($x) => $x > 5;

echo findOpeningPoint($array, $condition); // Выведет 7


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем заключается обработка ошибок и исключений?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Структуры данных в программировании какие знаешь?

Структуры данных — это способы хранения и организации данных в памяти компьютера. Они помогают эффективно управлять данными и выбирать оптимальные алгоритмы.

🚩Основные структуры данных

🟠Массив (Array)
Упорядоченная коллекция элементов, доступ к которым осуществляется по индексу. Когда нужно быстро получать элементы по индексу.
Доступ: O(1)
Поиск: O(n)
Вставка/Удаление: O(n) (из-за необходимости сдвига элементов)
$numbers = [10, 20, 30, 40]; 
echo $numbers[2]; // 30


🟠Связанный список (Linked List)
Элементы (узлы) хранят ссылку на следующий (а иногда и на предыдущий) элемент.
Когда часто вставляете/удаляете элементы (без затрат на сдвиг).
Доступ: O(n)
Вставка/Удаление: O(1) (если известен указатель)
class Node {
public int $data;
public ?Node $next;

public function __construct(int $data) {
$this->data = $data;
$this->next = null;
}
}


🟠Стек (Stack)
Структура LIFO (Last In, First Out). Элементы добавляются и удаляются только с одного конца.
Для обратного прохода, отмены операций, рекурсии.
Вставка/Удаление: O(1)
Доступ: O(n)
$stack = new SplStack();
$stack->push(1);
$stack->push(2);
echo $stack->pop(); // 2 (удаляется последний добавленный)


🟠Очередь (Queue)
Структура FIFO (First In, First Out). Первым зашёл – первым вышел.
Когда элементы должны обрабатываться по порядку (например, задачи в принтере).
Вставка/Удаление: O(1)
$queue = new SplQueue();
$queue->enqueue(1);
$queue->enqueue(2);
echo $queue->dequeue(); // 1 (удаляется первый добавленный)


🟠Хэш-таблица (Hash Table) / Ассоциативный массив
Хранит пары ключ → значение, обеспечивает быстрый доступ по ключу.
Когда нужен быстрый поиск и хранение пар ключ-значение.
Доступ/Поиск: O(1)
$hashTable = [
"name" => "Alice",
"age" => 25
];

echo $hashTable["name"]; // Alice


🟠Дерево (Tree)
Иерархическая структура, где каждый узел может иметь несколько дочерних.
Когда важны иерархии (например, файловые системы, база данных).
Виды
Двоичное дерево (Binary Tree) – у каждого узла до 2 детей.
Двоичное дерево поиска (BST) – левый потомок меньше, правый больше.
B-дерево – используется в базах данных.
Trie (Префиксное дерево) – для хранения строк, часто в поисковых движках.
class TreeNode {
public int $value;
public ?TreeNode $left = null;
public ?TreeNode $right = null;

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


🟠Граф (Graph)
Набор вершин (узлов) и рёбер (связей между узлами).
Для моделирования сетей, карт, социальных графов.
Типы графов
Ориентированный (направленный) / Неориентированный
Взвешенный / Невзвешенный
Ациклический (DAG)
$graph = [
"A" => ["B", "C"],
"B" => ["A", "D", "E"],
"C" => ["A", "F"],
"D" => ["B"],
"E" => ["B", "F"],
"F" => ["C", "E"]
];


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Factory?

Это паттерн проектирования, который предоставляет способ создания объектов без указания точного класса.
• Фабрика скрывает детали создания объектов, предоставляя интерфейс для их создания.
• Пример: ShapeFactory может возвращать объекты разных классов (Circle, Square) на основе входных параметров.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое внешний ключ?

Внешний ключ (foreign key) – это понятие из области реляционных баз данных, которое помогает устанавливать связи между таблицами.

🚩Зачем нужен внешний ключ?

🟠Обеспечение целостности данных:
Внешние ключи помогают гарантировать, что значения в столбце внешнего ключа всегда соответствуют значениям в первичном ключе другой таблицы. Это предотвращает создание "висячих" ссылок, когда запись в одной таблице ссылается на несуществующую запись в другой таблице.

🟠Упрощение управления связями между таблицами:
Внешние ключи облегчают управление и обновление связанных данных. Например, если удалить запись в родительской таблице, можно настроить каскадное удаление связанных записей в дочерней таблице.

🚩Как используется внешний ключ?

Внешний ключ создаётся при помощи SQL-запросов. Рассмотрим пример двух таблиц: orders (заказы) и customers (клиенты). Каждому заказу в таблице orders соответствует клиент в таблице customers.
-- Создание таблицы клиентов
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);

-- Создание таблицы заказов с внешним ключом
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);


customer_id в таблице orders является внешним ключом, который ссылается на customer_id в таблице customers. Это гарантирует, что каждое значение customer_id в таблице orders соответствует существующему customer_id в таблице customers.

🚩Каскадные действия

Существует возможность настроить каскадные действия для внешних ключей. Например:
-- Создание таблицы заказов с каскадным удалением
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE CASCADE
);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В каких местах нельзя использовать Laravel как фреймворк?

1. Реалтайм-приложения: Laravel не идеален для высоконагруженных приложений с минимальной задержкой, например, игр.
2. Микросервисы: Laravel может быть избыточен из-за большого количества встроенных компонентов.
3. Проекты с крайне низким бюджетом: из-за сложности поддержки на минимальных конфигурациях серверов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5