Библиотека собеса по PHP | вопросы с собеседований
3.04K subscribers
116 photos
39 links
Вопросы с собеседований по PHP и ответы на них.

Список наших каналов: https://t.me/proglibrary/9197
Учиться у нас: https://proglib.io/w/9f3affba

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv
Прайс: @proglib_advertising
Download Telegram
Как в общих чертах работает opcache?

OPcache (Opcode Cache) — это расширение для интерпретатора PHP, предназначенное для улучшения производительности выполнения PHP-скриптов. Его основная задача — кешировать промежуточный байт-код PHP (опкоды), чтобы уменьшить время компиляции и повторно использовать уже скомпилированный код при последующих запросах.

В общих чертах работа OPcache выглядит следующим образом:

Компиляция кода: Когда PHP-скрипт выполняется, он сначала компилируется в промежуточный байт-код (опкоды). Этот этап требуется при каждом запросе, если код не был изменен.

Кеширование: После компиляции кода OPcache сохраняет скомпилированный байт-код в памяти. Это позволяет избежать повторной компиляции при следующих запросах к тому же скрипту.

Повторное использование: В следующих запросах, если код скрипта не изменился, OPcache использует закешированный байт-код, обеспечивая более быстрое выполнение скрипта.

Инвалидация кеша: OPcache отслеживает изменения в PHP-файлах. Если файл изменяется, OPcache инвалидирует свой кеш для этого файла, чтобы обеспечить актуальность данных.

Преимущества использования OPcache включают улучшение производительности PHP-приложений за счет уменьшения времени компиляции и ускорения выполнения кода. Однако, следует отметить, что OPcache не является инструментом для улучшения самого кода; он просто устраняет необходимость повторной компиляции кода при каждом запросе.
Возможно ли увеличить время выполнения PHP-скрипта?

Да, возможно. Время выполнения PHP-скрипта контролируется директивой max_execution_time в конфигурации PHP. Эта директива устанавливает максимальное время, в секундах, в течение которого разрешено выполнение скрипта.

Вы можете увеличить время выполнения с помощью одного из следующих методов:

В самом скрипте:
Вы можете установить директиву max_execution_time внутри скрипта, используя функцию ini_set.

В файле конфигурации PHP (php.ini):
Если у вас есть доступ к файлу конфигурации PHP (php.ini), вы можете установить max_execution_time прямо там. Найдите файл php.ini и измените или добавьте строку:
max_execution_time = 300

В файле .htaccess (для Apache):
Если вы используете Apache, вы можете установить max_execution_time в файле .htaccess. Добавьте следующую строку:
php_value max_execution_time 300

В конфигурации Nginx (для Nginx):
Если вы используете Nginx, вы можете установить max_execution_time в блоке сервера вашей конфигурации Nginx. Добавьте следующую строку:
fastcgi_read_timeout 300;

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

Laravel Mix — это инструмент для автоматизации сборки фронтенда, встроенный в Laravel, который предоставляет простой и удобный интерфейс для работы с Webpack. Он особенно полезен для тех, кто хочет минимизировать сложность настройки инструментов фронтенд-разработки, таких как компиляция CSS/JS, минификация файлов, преобразование из современных стандартов (например, ES6+) в поддерживаемые браузерами, и многое другое.

Вот основные преимущества использования Laravel Mix в проектах:

1. Простота настройки
Laravel Mix предлагает преднастроенные конфигурации для самых распространенных задач, таких как компиляция Sass, Less, Babel и других. Для запуска большинства процессов достаточно нескольких команд в файле webpack.mix.js. Это делает его легким для освоения, особенно для разработчиков, которые не хотят вручную конфигурировать Webpack.

2. Интеграция с Laravel
Laravel Mix глубоко интегрирован с Laravel, что позволяет легко использовать его в проектах на этом фреймворке. Все предустановленные пути и файлы соответствуют стандартам Laravel, что упрощает структуру проекта. Кроме того, Mix прекрасно работает с Blade-шаблонами, предоставляя возможность использовать функцию mix() для добавления скомпилированных ресурсов в шаблоны с автоматическим добавлением хэшей для кэширования.

3. Удобная работа с CSS и препроцессорами
Mix поддерживает работу с Sass, Less, Stylus и PostCSS, что упрощает создание и управление CSS-стилями. Препроцессоры позволяют использовать современные возможности CSS, а PostCSS обеспечивает совместимость со старыми браузерами.

Поддержка PostCSS: Laravel Mix автоматически настраивает Autoprefixer для добавления вендорных префиксов в CSS-код.

4. Компиляция и минификация JavaScript
Mix компилирует JavaScript, поддерживая все современные возможности ES6+ с помощью Babel. Также он автоматически минифицирует файлы в production-режиме для ускорения загрузки сайта и улучшения его производительности.

5. Версионирование файлов (кэш-бустинг)
Mix добавляет уникальные хэши к именам файлов в production-режиме, что позволяет браузерам загружать обновленные версии файлов, избегая кэширования старых.

6. Поддержка Hot Module Replacement (HMR)
Mix поддерживает Hot Module Replacement для мгновенного обновления измененных модулей на странице без полной перезагрузки, что ускоряет процесс разработки.

7. Объединение и минификация ресурсов
Mix автоматически объединяет файлы JavaScript и CSS, уменьшая количество HTTP-запросов. В production-режиме он также автоматически минифицирует все файлы, снижая их размер.

8. Расширяемость
Laravel Mix поддерживает кастомные Webpack-конфигурации, если вам нужно что-то, что не поддерживается по умолчанию. Вы можете добавлять свои правила и плагины Webpack, если стандартные возможности Mix недостаточны для вашего проекта.

9. Поддержка разных технологий
Mix поддерживает Vue.js, React и другие библиотеки фронтенда «из коробки». Для использования Vue, например, нужно всего лишь добавить одну строку.

10. Оптимизация для production-окружений
Mix автоматически выполняет оптимизации при сборке проекта для production-среды, такие как минификация JavaScript и CSS, удаление комментариев и ненужного кода.
Что такое Views? Какие преимущества и недостатки?

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

Преимущества представлений (Views):

🟢Упрощение сложных запросов:

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

🟢Безопасность данных:

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

🟢Абстракция данных:

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

🟢Повторное использование запросов:

Представления позволяют использовать один и тот же запрос в разных частях приложения. Это снижает дублирование кода.

🟢Производительность:

В некоторых случаях, особенно если представление материализованное (materialized view), оно может улучшить производительность, так как результат запроса может быть сохранён и обновлён периодически, а не вычисляться при каждом обращении.

Недостатки представлений (Views):

🔸Ограниченные возможности обновления:

Некоторые представления не поддерживают обновление данных (INSERT, UPDATE, DELETE). Это особенно актуально для представлений, созданных на основе сложных запросов с агрегатами (GROUP BY, SUM и т. д.), объединений (JOIN) или подзапросов.
В этих случаях представление становится «только для чтения», что ограничивает его полезность в ряде ситуаций.

🔸Снижение производительности:

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

🔸Отсутствие индексов:

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

🔸Зависимость от структуры базовых таблиц:

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

🔸Сложность управления:

Если база данных содержит множество представлений, это может усложнить её структуру и сделать её менее прозрачной для администраторов и разработчиков.
Сложные каскадные представления (когда одно представление использует другое) могут привести к путанице и затруднить поддержку.
Что означает финальный метод в PHP?

«Final» в PHP означает метод, объявленный с ключевым словом final внутри класса. Когда метод помечен как final, это означает, что его нельзя переопределить ни в одном подклассе, который расширяет класс, в котором определён final метод.

Использование final методов может быть полезным, когда нужно обеспечить определённое поведение в классах и предотвратить дальнейшее изменение или расширение определённых методов в подклассах. Это обеспечивает уровень контроля над наследованием классов и помогает гарантировать, что критические методы останутся неизменными на протяжении всей иерархии наследования.
Каково назначение транзакций? Расскажите о принципе работы.

Назначение транзакций в базах данных состоит в обеспечении атомарности, целостности, согласованности и изолированности операций, которые изменяют данные.

Принцип работы транзакций обычно основан на следующих концепциях:

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

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

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

Устойчивость (Durability): После успешного завершения транзакции изменения данных должны быть надежно сохранены и доступны в случае сбоя системы или перезагрузки.

Принцип работы транзакций обычно включает в себя следующие этапы:

1️⃣Начало транзакции (BEGIN): Объявляется начало последовательности операций, которые должны быть выполнены атомарно.

2️⃣Выполнение операций: В этом этапе выполняются операции чтения и записи, которые являются частью транзакции.

3️⃣Фиксация (COMMIT): Если все операции выполнились успешно, транзакция завершается путем фиксации, и все изменения применяются к базе данных.

4️⃣Откат (ROLLBACK): Если в процессе выполнения транзакции произошла ошибка или нарушение условий целостности, транзакция отменяется путем отката, и все изменения, сделанные до этого момента, отменяются.
Объясните функцию ограничения скорости в Laravel и когда её следует использовать.

Функция ограничения скорости в Laravel

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

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

✔️Промежуточное ПО Throttle: Laravel предоставляет промежуточное ПО throttle, которое позволяет определять ограничения скорости для маршрутов или групп маршрутов.

✔️Определение лимитов: Вы можете задать количество разрешённых попыток и продолжительность (например, 100 запросов в минуту). Если лимит превышен, Laravel автоматически вернёт ответ HTTP 429 Too Many Requests (Слишком много запросов).

✔️Алгоритм «Leaky Bucket»: Laravel использует алгоритм «протекающего ведра» для равномерной обработки запросов с течением времени, вместо того чтобы допускать всплески запросов до достижения лимита.

✔️Динамическое ограничение скорости: Laravel позволяет устанавливать разные лимиты для различных пользователей, маршрутов или параметров запроса, что даёт больше контроля над конкретными случаями.

✔️Фасад RateLimiter: Фасад RateLimiter Laravel предоставляет более продвинутую конфигурацию и управление. Вы можете задавать лимиты на основе атрибутов запроса, таких как идентификатор пользователя, IP-адрес или другие свойства.

✔️Заголовки Retry: Когда клиент превышает лимит запросов, Laravel включает в ответ заголовки Retry-After, которые указывают, когда клиент может повторить запрос.

Пример ограничения скорости в Laravel

В файле routes/web.php или routes/api.php вы можете определить лимиты скорости следующим образом:
Route::middleware(['throttle:60,1'])->group(function () {
// Определите маршруты здесь
});


В данном случае throttle:60,1 означает, что пользователь может совершить 60 запросов в минуту.

Настройка лимитов

Вы можете настроить ограничения с помощью фасада RateLimiter. Например, можно задать лимит на основе идентификатора пользователя:
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(100)->by($request->user()?->id ?: $request->ip());
});


Этот код ограничивает количество запросов до 100 в минуту, и использует идентификатор аутентифицированного пользователя, либо IP-адрес, если пользователь не аутентифицирован.

Когда использовать ограничение скорости

🔸Предотвращение злоупотреблений или DDoS-атак: Ограничение скорости помогает смягчить последствия вредоносных действий, таких как атаки распределённого отказа в обслуживании (DDoS), контролируя количество запросов, которые может выполнить один пользователь или IP за определённый промежуток времени.

🔸Ограничение скорости API: При предоставлении API внешним пользователям, ограничение скорости гарантирует, что ни один пользователь или клиент не потребляет слишком много ресурсов, что может негативно сказаться на производительности приложения.

🔸Защита чувствительных конечных точек: Для маршрутов, которые выполняют ресурсоёмкие операции, такие как загрузка файлов или запросы к базе данных, ограничение скорости помогает защитить инфраструктуру от перегрузки.

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

🔸Предотвращение перегрузки системы ботами: Веб-приложения часто нуждаются в защите от автоматизированных действий (например, отправка форм или получение данных ботами). Ограничение скорости помогает контролировать такие активности.
Что такое межсайтовый скриптинг?

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

Существуют два основных типа межсайтового скриптинга:

Хранимый (Stored) XSS: Злоумышленник вводит вредоносный скрипт непосредственно на сервере, обычно через поля ввода или комментарии на веб-сайте. Затем этот скрипт сохраняется на сервере и выполняется при просмотре страницы другими пользователями.

Рефлектированный (Reflected) XSS: Вредоносный скрипт передается на сервер через параметры URL, формы или другие входные данные. Затем сервер возвращает этот скрипт в браузер пользователя, где он выполняется. Например, злоумышленник может создать ссылку, содержащую вредоносный скрипт, и убедить пользователя перейти по этой ссылке.

Межсайтовый скриптинг может быть использован для кражи сессий, перенаправления на фишинговые сайты, введения пользователя в заблуждение, кражи конфиденциальных данных и многих других атак. Для защиты от XSS атак следует использовать соответствующие техники санитизации входных данных, контекстного экранирования и использования Content Security Policy (CSP).
Расскажите о шаблонах GRASP.

Шаблоны GRASP (General Responsibility Assignment Software Patterns) — это набор принципов проектирования объектно-ориентированного кода, которые помогают определить, какие классы или объекты будут выполнять конкретные задачи и ответственности. Они помогают улучшить структуру кода, делая его более гибким, читаемым и поддерживаемым.

Ниже представлены основные шаблоны GRASP:

1. Expert (Эксперт) — данный шаблон назначает ответственность объекту, который обладает наиболее полной информацией для выполнения определенной задачи. Таким образом, эксперт в данном контексте является наиболее квалифицированным объектом для выполнения определенной операции.

2. Creator (Создатель) — данный шаблон определяет, что объект должен быть ответственным за создание других объектов. То есть, если объект А тесно связан с объектом В и может быть считаться его создателем инициализации, то объект А должен брать на себя ответственность за создание объекта В.

3. Controller (Контроллер) — данный шаблон назначает объекту ответственность контроля за интерфейсом пользователя и управления потоком данных. Контроллер обрабатывает пользовательский ввод и инициирует действия в системе.

4. Low Coupling (Низкая связанность) — данный шаблон подразумевает, что объект должен иметь наименьшую возможную зависимость от других объектов. Это достигается путем использования абстракций и интерфейсов, чтобы объекты могли взаимодействовать, не зная подробности друг о друге.

5. High Cohesion (Высокая связность) — данный шаблон подразумевает, что каждый класс должен представлять собой логическую единицу функциональности. Класс должен иметь одну ответственность и хорошо определенный смысл.

6. Indirection (Индиректирование) — данный шаблон назначает объекту посредническую роль для связи между другими объектами. То есть, объект А не обращается напрямую к объекту В, а связь между ними возникает через объект-посредник.

7. Polymorphism (Полиморфизм) — данный шаблон направлен на использование полиморфизма в объектно-ориентированном программировании. Полиморфизм позволяет работать с разными типами объектов через один и тот же интерфейс, что делает систему более гибкой и расширяемой.
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ
Что делает функция «unlink»?

В PHP функция unlink() используется для удаления файла из файловой системы. Она принимает единственный параметр — путь к файлу, который вы хотите удалить. После вызова unlink() попытается удалить указанный файл из файловой системы. В случае успешного выполнения файл будет удален безвозвратно.

Код из примера проверяет, существует ли файл, и если да, то пытается удалить его с помощью unlink(). В случае успешного удаления выводится «Файл успешно удален.»; в противном случае выводится «Ошибка при удалении файла.». Если файл не существует, выводится «Файл не существует.».
Что такое Zend Engine?

Zend Engine — это механизм выполнения на языке C с открытым исходным кодом, который интерпретирует язык программирования PHP. Он был изначально разработан Анди Гутмансом и Зеевом Сураcки, когда они были студентами Технического университета Израиля.

Zend Engine служит ядром среды выполнения PHP, обеспечивая основные функции для разбора, компиляции и выполнения PHP-скриптов. Он также включает в себя функциональность по управлению памятью, сборке мусора и поддержке расширений, делая его универсальной платформой для запуска приложений на PHP.

Одним из важных вкладов Zend Engine в эволюцию PHP стало внедрение Zend Extension API (ZE), позволяющего разработчикам создавать собственные расширения на C или C++, чтобы расширить функциональность PHP. Эти расширения могут использоваться для интеграции PHP с внешними библиотеками, добавления новых возможностей или оптимизации производительности.
Что такое $_ENV?

$_ENV — это суперглобальная переменная в PHP, которая содержит ассоциативный массив переменных окружения, переданных текущему скрипту с использованием метода окружения. Эти переменные устанавливаются веб-сервером или окружением командной строки, в котором выполняется PHP-скрипт. Например, если ваш скрипт PHP выполняется через веб-сервер, такой как Apache или Nginx, $_ENV может содержать переменные окружения, такие как детали конфигурации сервера, информацию о клиенте или другие системо-специфичные переменные.
Что такое агрегатные функции SQL? Приведите несколько примеров.

Агрегатные функции в SQL это функции, которые применяются к набору значений и возвращают единое вычисленное значение. Они используются для выполнения вычислительных операций над группами строк данных. Некоторые из наиболее распространенных агрегатных функций в SQL включают в себя:

SUM: Вычисляет сумму значений в столбце.

AVG: Вычисляет среднее значение для значений в столбце.

COUNT: Подсчитывает количество строк в результате запроса.

MIN: Находит минимальное значение в столбце.

MAX: Находит максимальное значение в столбце.

GROUP_CONCAT: Собирает значения из столбца в единый текстовый список.

STDEV: Вычисляет стандартное отклонение значений в столбце.

VARIANCE: Вычисляет дисперсию значений в столбце.

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

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

Шаги для создания и использования пользовательского правила валидации:

1. Создание пользовательского правила

Для создания нового правила в Laravel можно воспользоваться artisan-командой:
php artisan make:rule CustomRuleName

Это создаст файл правила в директории app/Rules.

2. Реализация правила
После создания файла правила, откройте его и настройте логику валидации. Например, правило для проверки строки на заглавную букву может выглядеть так:
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class StartsWithUppercase implements Rule
{
/**
* Создать новый экземпляр правила.
*/
public function __construct()
{
//
}

/**
* Определить, проходит ли атрибут проверку.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Проверка, что первая буква заглавная
return mb_strtoupper(mb_substr($value, 0, 1)) === mb_substr($value, 0, 1);
}

/**
* Получить сообщение об ошибке валидации.
*
* @return string
*/
public function message()
{
return 'The :attribute must start with an uppercase letter.';
}
}


3. Использование правила в контроллере или форме
Чтобы применить пользовательское правило, просто укажите его в массиве правил в вашем контроллере или форме. Например:
use App\Rules\StartsWithUppercase;

public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', new StartsWithUppercase()],
]);

// Дальнейшая логика сохранения данных...
}


Таким образом, когда поле title не будет начинаться с заглавной буквы, сработает ошибка валидации, и сообщение будет взято из метода message() вашего правила.

4. Локализация сообщения
Для того чтобы локализовать сообщение об ошибке, можно изменить метод message() так, чтобы он использовал файл локализации:
public function message()
{
return __('validation.custom.uppercase');
}

А затем в resources/lang/ru/validation.php добавить ключ для локализации:
'custom' => [
'uppercase' => 'Заголовок должен начинаться с заглавной буквы.',
],


5. Валидация без создания классов (быстрый способ)
Если нужно быстро создать кастомную валидацию без создания отдельного класса, можно использовать замыкания в методе validate():
$request->validate([
'title' => ['required', function ($attribute, $value, $fail) {
if (mb_strtoupper(mb_substr($value, 0, 1)) !== mb_substr($value, 0, 1)) {
$fail('The ' . $attribute . ' must start with an uppercase letter.');
}
}],
]);
Что такое сериализация и десериализация?

Сериализация и десериализация — это процессы преобразования данных из их структурированного формата (например, объекты, массивы) в последовательность байтов (обычно в виде строки) и обратно. В PHP для этих целей используются функции serialize() и unserialize().

Сериализация:

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

Функция в PHP: serialize() — принимает переменную и возвращает её строковое представление.

Десериализация:

Определение: Десериализация — это процесс восстановления структурированных данных из их строкового представления.

Функция в PHP: unserialize() — принимает строку, созданную с помощью serialize(), и возвращает восстановленные данные.

Применение сериализации и десериализации:

Хранение данных: Сериализация может использоваться для сохранения состояния объектов или массивов в файле или в базе данных.
Передача данных: Сериализация может быть полезной при передаче данных между разными частями приложения, например, при работе с сетью или сохранении состояния сеанса.

Важно отметить, что не все данные могут быть сериализованы. Например, ресурсы (resource), некоторые типы объектов и замыкания не могут быть корректно сериализованы и десериализованы в PHP.
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
👉Переводчик и автор оригинальных статей

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
В чём разница между методами __sleep и __wakeup в PHP?

__sleep() и __wakeup() — это магические методы в PHP, которые используются в связке с сериализацией и десериализацией объектов. Вот их краткое описание:

__sleep():
Этот метод вызывается автоматически, когда объект готовится к сериализации (например, с помощью функции serialize()).
Он позволяет определить, какие свойства объекта должны быть сериализованы. Вы возвращаете массив с именами свойств, которые должны быть сериализованы.
Если у вас есть чувствительные данные или ресурсы, которые не должны быть сериализованы, вы можете удалить или изменить их в этом методе.

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

В заключение, __sleep() используется для контроля над тем, какие свойства сериализуются, а __wakeup() используется для выполнения действий после десериализации. Они предоставляют хуки для настройки процесса сериализации и десериализации объектов в PHP.