PHP | Вопросы собесов
2.3K subscribers
34 photos
1.54K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @sendme_ads
Download Telegram
🤔 Есть ли какое-то различие между одинарными и двойными кавычками?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 В чем недостатки асинхронного шифрования?

Асинхронное шифрование (или шифрование с открытым ключом, например, RSA, ECC) использует два ключа:
Открытый ключ (Public Key) – для шифрования
Закрытый ключ (Private Key) – для расшифровки

🚩Основные недостатки асинхронного шифрования

🟠Медленнее, чем симметричное шифрование
Шифрование и расшифровка занимают больше времени, потому что алгоритмы (например, RSA) используют сложные математические операции (экспоненцирование и факторизацию).
AES (симметричное) в 100–1000 раз быстрее, чем RSA.

🟠Длина ключа больше → больше ресурсов
Чтобы обеспечить безопасность, RSA требует очень длинных ключей (2048+ бит).
Чем длиннее ключ, тем больше памяти и CPU требуется для вычислений.

🟠Уязвимость к квантовым атакам
Квантовые компьютеры смогут быстро взломать RSA и ECC с помощью алгоритма Шора.
AES-256 останется безопасным, но RSA-2048 можно будет взломать за несколько часов или минут.

🟠Усложнённое управление ключами
Нужно генерировать, хранить и передавать пары ключей.
Закрытый ключ нельзя потерять – иначе данные невозможно расшифровать.
Если злоумышленник завладеет закрытым ключом, он сможет расшифровать всю информацию.

🟠Атаки MITM и проблемы доверия
Открытый ключ может быть подменён злоумышленником (атака "человек посередине" – MITM).
Если хакер подменит публичный ключ, он сможет расшифровать данные.

Ставь 👍 и забирай 📚 Базу знаний
👍1💊1
🤔 Что такое ООП?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Для чего нужен Синглтон паттерн?

🟠Контроль над созданием объекта
Иногда требуется, чтобы у определенного класса был только один экземпляр в течение жизненного цикла программы. Это может быть связано с тем, что данный объект использует значительные ресурсы или имеет состояние, которое должно быть уникальным.

🟠Глобальная точка доступа
Синглтон предоставляет простой способ доступа к объекту из любой точки программы. Это упрощает управление состоянием приложения, поскольку все части программы могут взаимодействовать с одним и тем же экземпляром объекта.

🚩Как используется?

1⃣Закрытие конструктора
Конструктор объявляется закрытым (private), чтобы предотвратить создание объекта напрямую через оператор new.
2⃣Закрытие клонирования
Метод клонирования (magic method __clone()) тоже объявляется закрытым, чтобы запретить клонирование объекта.
3⃣Закрытие десериализации
Метод десериализации (magic method __wakeup()) также объявляется закрытым, чтобы предотвратить восстановление объекта из строки.
4⃣Статический метод для получения экземпляра
Создается статический метод, который проверяет, существует ли уже экземпляр объекта. Если нет, то создается новый; если да, то возвращается существующий.

Пример
class Singleton {
// Статическое свойство для хранения единственного экземпляра
private static $instance;

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

// Запрет клонирования объекта
private function __clone() {}

// Запрет десериализации объекта
private function __wakeup() {}

// Метод для получения единственного экземпляра
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}

// Пример метода
public function sayHello() {
echo "Hello, Singleton!";
}
}

// Использование синглтона
$singleton = Singleton::getInstance();
$singleton->sayHello(); // Выведет "Hello, Singleton!"


🟠Контролируемое создание
Конструктор закрыт, поэтому экземпляр можно создать только внутри класса через метод getInstance().
🟠Глобальная доступность
Поскольку метод getInstance() статический, он доступен в любом месте кода, что делает доступ к экземпляру глобальным.
🟠Один экземпляр
Проверка в методе getInstance() гарантирует, что будет создан только один экземпляр класса.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Какую проблему решают фабрика и фабричный метод?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие виды уязвимости знаешь?

В веб-разработке существует множество уязвимостей, но самые распространенные
SQL-инъекции (SQL Injection)
Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Ошибки аутентификации и управления сессиями
Необработанные пользовательские данные
Доступ к файлам и директориям (LFI/RFI – Local/Remote File Inclusion)
Ошибки конфигурации сервера и утечки данных

🟠SQL-инъекции (SQL Injection)
Атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, получая доступ к БД.
Чтение / изменение данных
Удаление таблиц
Получение паролей пользователей
Используем подготовленные запросы (Prepared Statements)
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();


🟠Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу.
Кража cookies и сеансов
Изменение содержимого страницы
Фишинг
Очистка данных перед выводом
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');


🟠Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Злоумышленник заставляет пользователя выполнить нежелательный запрос от его имени (например, перевести деньги).
Изменение данных без ведома пользователя
Подмена учетных записей
Используем CSRF-токены
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));


При отправке формы проверяем
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF атака!");
}


🟠Ошибки аутентификации и управления сессиями
Если пароли хранятся неправильно или сессии уязвимы, злоумышленник может перехватить учетную запись пользователя.
Кража пароля
Перехват сессии
Храним пароли с password_hash(), а не в открытом виде:
$hash = password_hash("mypassword", PASSWORD_BCRYPT);


🟠Необработанные пользовательские данные
Приложение принимает и использует входные данные без проверки.
Возможность загрузки вредоносных файлов
Выполнение вредоносного кода
Проверяем загружаемые файлы (MIME-тип, расширение)
Используем валидацию данных:
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);


🟠Доступ к файлам и директориям (LFI/RFI)
Злоумышленник может загружать и выполнять опасные файлы через параметры в URL.
Выполнение кода на сервере
Чтение конфиденциальных файлов
Запрещаем прямую загрузку файлов:
$whitelist = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $whitelist)) {
die("Недопустимый файл!");
}


🟠Ошибки конфигурации сервера и утечки данных
Если сервер настроен неправильно, можно случайно раскрыть важные данные.
Вывод ошибок PHP в браузере
Доступ к файлам .env, config.php
Отключаем display_errors в php.ini:
display_errors = Off


Защищаем файлы .env через .htaccess

  <Files .env>
Order allow,deny
Deny from all
</Files>


Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие типы объединений есть в таблицах?

Типы объединений: INNER JOIN (только совпадающие строки), LEFT JOIN (все строки из левой таблицы), RIGHT JOIN (все строки из правой таблицы), FULL JOIN (объединение всех строк обеих таблиц), CROSS JOIN (декартово произведение), SELF JOIN (объединение таблицы с самой собой).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем принцип работы HashTable?

Хеш-таблица – это структура данных, которая хранит пары "ключ → значение" и использует хеш-функцию для быстрого поиска, добавления и удаления данных.

🚩Основная идея

Ключ обрабатывается хеш-функцией → превращается в числовой индекс.
По индексу данные хранятся в массиве.
Быстрое обращение к данным по ключу: O(1) в среднем.

🚩Как это работает?

🟠Хеширование ключа
Представим, что у нас есть ключ "apple", и мы храним для него значение 100.
Применяем хеш-функцию к "apple"
$hash = hash('md5', 'apple'); 
echo $hash; // 1f3870be274f6c49b3e31a0c6728957f


Это хеш – длинное число, но нам нужно индексировать данные, поэтому мы берем его остаток от деления на размер массива (mod):
$index = hexdec(substr($hash, 0, 8)) % 10; 
echo $index; // Например, 3


🟠Поиск элемента
Когда мы ищем apple, алгоритм:
Применяет ту же хеш-функцию, получает индекс 3
Ищет значение в ячейке 3
Таким образом, поиск данных по ключу происходит мгновенно – O(1).
Коллизия – это когда разные ключи дают один и тот же индекс.
Пример: "apple" и "banana" могут попасть в одну ячейку!
Решения:
Метод цепочек – внутри каждой ячейки храним список значений (например, массив или связанный список).
Открытая адресация – если ячейка занята, ищем следующую свободную.

🚩Хеш-таблица в PHP

В PHP массивы (array) работают как хеш-таблицы!
$hashTable = [];
$hashTable['apple'] = 100;
$hashTable['banana'] = 200;

echo $hashTable['apple']; // 100


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое агрегатные функции?

Агрегатные функции в SQL и других языках обработки данных (как PHP при работе с базами данных) выполняют вычисление набора значений и возвращают единственное значение. Примеры включают `SUM()`, `AVG()`, `MIN()`, `MAX()`, и `COUNT()`.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Что такое SSH-протокол?

SSH (Secure Shell) — это сетевой протокол, который используется для безопасного доступа к удаленным компьютерам и управления ими. Он обеспечивает шифрование данных, аутентификацию и целостность передаваемой информации, что делает его предпочтительным средством для удаленного администрирования и передачи файлов.

🚩Основные характеристики и возможности

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

🟠Аутентификация
Парольная аутентификация: Пользователь вводит свой логин и пароль для доступа к удаленной системе.
Аутентификация с помощью ключей: Вместо пароля используется пара ключей (публичный и приватный). Публичный ключ размещается на удаленном сервере, а приватный ключ остается на клиентской машине.

🟠Шифрование данных
Шифрует все передаваемые данные, включая пароли, команды и файлы, что предотвращает их перехват и несанкционированный доступ.

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

🟠Туннелирование
Позволяет создавать зашифрованные туннели для передачи данных других протоколов (например, HTTP, FTP), обеспечивая их безопасность.

🚩Основные компоненты

🟠SSH-клиент
Установленное на локальном компьютере, которое используется для установления соединения с удаленным сервером.
🟠SSH-сервер
Работающее на удаленной машине, которое принимает и обрабатывает соединения от SSH-клиентов.

🚩Пример

🟠Установка соединения с удаленным сервером:
Для подключения к удаленному серверу используется команда ssh в терминале.
ssh username@remote_host   


🟠Копирование файлов через SSH
Для копирования файлов с локального компьютера на удаленный сервер или наоборот используется команда scp.
scp localfile.txt username@remote_host:/remote/directory/   


Копирование файлов с удаленного сервера на локальный компьютер
scp username@remote_host:/remote/file.txt /local/directory/   


🟠Использование ключей для аутентификации
Генерация пары ключей (публичного и приватного)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"   


Копирование публичного ключа на удаленный сервер
ssh-copy-id username@remote_host


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое CQRS?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥1
🤔 Что будет если мы цифру 3 int сложим плюсом со строкой 4 что будет?

Если в PHP выполнить операцию сложения (+) числа 3 (int) и строки "4" (string), то PHP автоматически приведёт строку "4" к числу, и произойдёт арифметическая операция:
$result = 3 + "4";
echo $result; // 7


🚩Как это работает?

PHP видит, что используется оператор +, который применяется только к числам.
"4" — это строка, но она содержит только число, поэтому PHP автоматически преобразует её в int.
Затем выполняется операция 3 + 4, и результатом будет 7.

🚩Что если строка не является числом?

Если строка не является корректным числом, PHP попробует взять из неё число с начала строки. Если в начале строки нет цифр, то строка будет воспринята как 0.

Примеры странных случаев
echo 3 + "4abc";  // 7   (строка "4abc" преобразуется в число 4)
echo 3 + "abc4"; // 3 (строка "abc4" преобразуется в 0, т.к. начинается не с цифры)
echo 3 + "0.5"; // 3.5 (строка "0.5" преобразуется в число 0.5)
echo 3 + " "; // 3 (пробелы преобразуются в 0)


🚩Что если использовать `.` вместо `+`?

Если вместо + использовать . (конкатенацию строк), то числа не складываются, а просто соединяются как строки
echo 3 . "4"; // "34" (строка)


Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое полиморфизм

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Какие могут быть проблемы от JOIN'а?

Объединение таблиц через JOIN может вызвать:
- Снижение производительности – если таблицы большие и нет индексов, выполнение запроса может быть долгим.
- Дублирование данных – неправильное соединение может привести к множеству дублирующихся строк.
- Рост потребления памяти – большие JOIN'ы могут потреблять много оперативной памяти и временных файлов.
- Блокировки и конкуренция – если JOIN выполняется на обновляемых данных, могут возникать блокировки записей.
- Сложность оптимизации – сложные JOIN'ы труднее индексировать и оптимизировать.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какая разница между self и this?

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

🚩this

Используется для обращения к текущему объекту класса. Он позволяет получить доступ к нестатическим свойствам и методам объекта. Является ссылкой на вызываемый объект и используется внутри методов объекта для обращения к его свойствам и методам.
class Car {
public $color = 'red';

public function getColor() {
return $this->color; // Используется $this для доступа к свойству текущего объекта
}
}

$myCar = new Car();
echo $myCar->getColor(); // Выведет 'red'


🚩self

Используется для обращения к текущему классу и применяется в основном для доступа к статическим свойствам и методам класса. Ссылается на класс, в котором она была вызвана, и не требует создания экземпляра объекта для доступа к содержимому.
class Car {
public static $count = 0;

public function __construct() {
self::$count++; // Используется self для доступа к статическому свойству
}

public static function getTotalCars() {
return self::$count; // Обращение к статическому методу или свойству
}
}

$newCar1 = new Car();
$newCar2 = new Car();
echo Car::getTotalCars(); // Выведет '2'


🚩Основные различия

🟠Контекст использования
$this используется для доступа к свойствам и методам текущего объекта экземпляра, тогда как self используется для доступа к статическим свойствам и методам класса.
🟠Статический vs Нестатический
$this нельзя использовать в статических методах, потому что статические методы могут быть вызваны без создания объекта класса. self, напротив, предназначена для использования в статическом контексте.
🟠Привязка
self привязана к классу, в котором она написана, а $this — к объекту, через который вызывается метод.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое middleware?

Middleware в PHP — это компонент, который обрабатывает HTTP-запросы и ответы на пути между сервером и конечной точкой. Каждый middleware может модифицировать запрос, ответ или остановить выполнение цепочки, отправив ответ напрямую. Они используются для выполнения задач, таких как аутентификация, логирование, обработка ошибок и кэширование. Middleware широко применяется в современных фреймворках, таких как Laravel, для разделения логики обработки запросов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1
🤔 Чем отличается Require от Includ'а?

В PHP есть две схожие конструкции для подключения файлов: require и include. Однако между ними есть важные различия.

🟠Основное различие: Ошибки при отсутствии файла
require вызывает фатальную ошибку (Fatal Error), если указанный файл не найден или содержит ошибку. Это приведёт к немедленному завершению выполнения скрипта.
include вызывает предупреждение (Warning), но код продолжит выполняться дальше.
require 'somefile.php'; // Если файла нет, скрипт завершится с ошибкой
echo "Этот код не выполнится";


Результат (если файла somefile.php нет):
Fatal error: require(): Failed opening 'somefile.php'...


Пример с include
include 'somefile.php'; // Если файла нет, скрипт выдаст предупреждение, но продолжит выполняться
echo "Этот код выполнится";


Результат (если файла somefile.php нет):
Warning: include(somefile.php): failed to open stream...
Этот код выполнится


🟠Использование и рекомендации
require используют, когда файл обязателен для работы скрипта (например, файл с настройками или важными функциями).
include используют, когда файл необязателен, и его отсутствие не должно прерывать выполнение (например, дополнительный шаблон страницы).

🟠`require_once` и `include_once`
Дополнительно существуют require_once и include_once, которые работают аналогично, но не подключают файл повторно, если он уже был подключён.
require_once 'config.php'; // Подключится только один раз, даже если вызвано несколько раз


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что известно про фабрики?

Это порождающий паттерн, создающий объекты без явного указания их класса.
1. Simple Factory: один метод создаёт разные объекты.
2. Factory Method: делегирует создание объектов подклассам.
3. Abstract Factory: создаёт семейства связанных объектов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое внешний ключ?

Внешний ключ (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
);


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое SOLID?

SOLID — это набор из пяти принципов объектно-ориентированного проектирования, направленных на создание более устойчивого и поддерживаемого кода. Эти принципы включают: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (замещение Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Применение SOLID помогает избежать чрезмерной сложности и делает код более гибким. Эти принципы часто используются для улучшения архитектуры приложений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое замыкание?

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

🚩Основные особенности замыканий

🟠Доступ к внешним переменным
Функция может использовать переменные из внешнего контекста, в котором она была создана.
🟠Сохранение состояния
Замыкания могут сохранять состояние между вызовами.

🟠Инкапсуляция
Замыкания могут использоваться для создания частных данных и методов.

🚩Примеры замыканий в различных языках программирования

🟠JavaScript
В JavaScript замыкания используются очень часто. Рассмотрим простой пример:
function createCounter() {
let count = 0; // внешняя переменная

return function() { // внутренная функция
count++;
return count;
}
}

const counter = createCounter(); // создаем замыкание
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3


🟠Python
В Python замыкания также поддерживаются:
def create_counter():
count = 0

def increment():
nonlocal count
count += 1
return count

return increment

counter = create_counter()
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3


🟠PHP
В PHP замыкания реализуются через анонимные функции и использование use:
function createCounter() {
$count = 0;

return function() use (&$count) {
$count++;
return $count;
};
}

$counter = createCounter();
echo $counter(); // 1
echo $counter(); // 2
echo $counter(); // 3


🚩Применение замыканий

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

🟠Инкапсуляция
Замыкания позволяют скрывать переменные и методы внутри функции, предоставляя интерфейс для взаимодействия с ними.

🟠Обработка событий
В языках, таких как JavaScript, замыкания часто используются в обработчиках событий для доступа к контексту, в котором был назначен обработчик.

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

Ставь 👍 и забирай 📚 Базу знаний
👍1