В чем разница между Serializer и Normalizer в Symfony?
В Symfony сериализаторы и нормализаторы используются для обработки преобразования данных, но они выполняют разные функции и работают на разных уровнях абстракции.
Сериализатор (Serializer)
Сериализатор отвечает за преобразование сложных структур данных (таких как объекты и массивы) в определённый формат (например, JSON, XML или CSV) и обратно. Компонент Serializer в Symfony предоставляет унифицированный способ выполнения этого процесса.
Основные задачи сериализатора:
Сериализация: Преобразование структур данных PHP (объекты, массивы) в строковой формат (JSON, XML и т.д.).
Десериализация: Преобразование строкового формата (JSON, XML и т.д.) обратно в структуры данных PHP.
Например, если у вас есть объект, и вы хотите получить его представление в формате JSON, вы будете использовать сериализатор.
Нормализатор (Normalizer)
Нормализатор — это более детализированное понятие, которое занимается преобразованием между различными представлениями данных в процессе сериализации. Нормализаторы используются сериализатором для обработки преобразования конкретных типов данных.
Основные задачи нормализатора:
Нормализация: Преобразование объекта в нормализованный массив.
Денормализация: Преобразование нормализованного массива обратно в объект.
Нормализаторы фокусируются на разложении и восстановлении объектов и массивов без непосредственного взаимодействия с конечным форматом, таким как JSON или XML. Они обрабатывают промежуточный этап преобразования данных в ассоциативный массив, который сериализатор затем может преобразовать в требуемый формат.
В Symfony сериализаторы и нормализаторы используются для обработки преобразования данных, но они выполняют разные функции и работают на разных уровнях абстракции.
Сериализатор (Serializer)
Сериализатор отвечает за преобразование сложных структур данных (таких как объекты и массивы) в определённый формат (например, JSON, XML или CSV) и обратно. Компонент Serializer в Symfony предоставляет унифицированный способ выполнения этого процесса.
Основные задачи сериализатора:
Сериализация: Преобразование структур данных PHP (объекты, массивы) в строковой формат (JSON, XML и т.д.).
Десериализация: Преобразование строкового формата (JSON, XML и т.д.) обратно в структуры данных PHP.
Например, если у вас есть объект, и вы хотите получить его представление в формате JSON, вы будете использовать сериализатор.
Нормализатор (Normalizer)
Нормализатор — это более детализированное понятие, которое занимается преобразованием между различными представлениями данных в процессе сериализации. Нормализаторы используются сериализатором для обработки преобразования конкретных типов данных.
Основные задачи нормализатора:
Нормализация: Преобразование объекта в нормализованный массив.
Денормализация: Преобразование нормализованного массива обратно в объект.
Нормализаторы фокусируются на разложении и восстановлении объектов и массивов без непосредственного взаимодействия с конечным форматом, таким как JSON или XML. Они обрабатывают промежуточный этап преобразования данных в ассоциативный массив, который сериализатор затем может преобразовать в требуемый формат.
Что такое sensitive данные? Как хранятся в базе? Как отражаются в логах?
Sensitive данные (чувствительные данные) — это информация, которая является приватной, конфиденциальной или важной для безопасности организации или пользователя. К таким данным относятся, например, пароли, номера кредитных карт, персональные идентификационные номера и т.д.
Хранение sensitive данных в базе данных требует особых мер безопасности, чтобы предотвратить несанкционированный доступ. Важной практикой является хеширование паролей. При регистрации пользователя пароль хешируется — процесс преобразования пароля в непонятный для чтения вид. Затем хеш сохраняется в базе данных. При входе в систему, введенный пароль также хешируется, и соответствующий хеш сравнивается с сохраненным в базе данных.
Sensitive данные не должны непосредственно отражаться в логах. Вместо этого должна быть сохранена информация о том, что операция на sensitive данных была выполнена. Например, вместо того, чтобы сохранять сам пароль в логах, можно сохранить запись вроде «пользователь X изменил свой пароль». Это делается для предотвращения утечки конфиденциальной информации в случае несанкционированного доступа к логам.
Sensitive данные (чувствительные данные) — это информация, которая является приватной, конфиденциальной или важной для безопасности организации или пользователя. К таким данным относятся, например, пароли, номера кредитных карт, персональные идентификационные номера и т.д.
Хранение sensitive данных в базе данных требует особых мер безопасности, чтобы предотвратить несанкционированный доступ. Важной практикой является хеширование паролей. При регистрации пользователя пароль хешируется — процесс преобразования пароля в непонятный для чтения вид. Затем хеш сохраняется в базе данных. При входе в систему, введенный пароль также хешируется, и соответствующий хеш сравнивается с сохраненным в базе данных.
Sensitive данные не должны непосредственно отражаться в логах. Вместо этого должна быть сохранена информация о том, что операция на sensitive данных была выполнена. Например, вместо того, чтобы сохранять сам пароль в логах, можно сохранить запись вроде «пользователь X изменил свой пароль». Это делается для предотвращения утечки конфиденциальной информации в случае несанкционированного доступа к логам.
Коротко расскажите об истории PHP. Что появлялось в каждой версии?
PHP 1.0 (1995): Ранняя версия PHP, созданная Расмусом Лердорфом. Она представляла собой набор скриптов для отслеживания посещений его онлайн-резюме.
PHP 2.0 (1996): Внедрение синтаксиса, похожего на Perl, и добавление поддержки для работы с базами данных.
PHP 3.0 (1998): Полная переработка языка. Добавление поддержки объектно-ориентированного программирования (ООП) и формальное определение языка.
PHP 4.0 (2000): Значительные улучшения производительности и добавление новых возможностей, таких как суперглобальные массивы ($_GET, $_POST) и поддержка для расширений.
PHP 5.0 (2004): Основной момент — введение поддержки ООП с использованием классов и объектов. Добавление механизма обработки ошибок Exception.
PHP 5.3 (2009): Введение пространств имен, замыкания (closures) и поддержка late static binding.
PHP 5.4 (2012): Включение трейтов (traits), короткого синтаксиса для массивов, и улучшения в производительности.
PHP 5.6 (2014): Поддержка переменных переменных, использование оператора ** в качестве оператора возврата.
PHP 7.0 (2015): Значительное увеличение производительности, введение строгой типизации (scalar type declarations и return type declarations), нулевой объединяющий оператор (null coalescing operator), и другие улучшения.
PHP 7.4 (2019): Добавление стрелочных функций (arrow functions), поддержка spread-оператора для массивов, а также улучшения в синтаксисе и производительности.
PHP 8.0 (2020): Множество новых возможностей, таких как JIT-компиляция для улучшения производительности, добавление строгой типизации для свойств классов, сопоставление шаблонов (match expression), и другие синтаксические улучшения.
PHP 1.0 (1995): Ранняя версия PHP, созданная Расмусом Лердорфом. Она представляла собой набор скриптов для отслеживания посещений его онлайн-резюме.
PHP 2.0 (1996): Внедрение синтаксиса, похожего на Perl, и добавление поддержки для работы с базами данных.
PHP 3.0 (1998): Полная переработка языка. Добавление поддержки объектно-ориентированного программирования (ООП) и формальное определение языка.
PHP 4.0 (2000): Значительные улучшения производительности и добавление новых возможностей, таких как суперглобальные массивы ($_GET, $_POST) и поддержка для расширений.
PHP 5.0 (2004): Основной момент — введение поддержки ООП с использованием классов и объектов. Добавление механизма обработки ошибок Exception.
PHP 5.3 (2009): Введение пространств имен, замыкания (closures) и поддержка late static binding.
PHP 5.4 (2012): Включение трейтов (traits), короткого синтаксиса для массивов, и улучшения в производительности.
PHP 5.6 (2014): Поддержка переменных переменных, использование оператора ** в качестве оператора возврата.
PHP 7.0 (2015): Значительное увеличение производительности, введение строгой типизации (scalar type declarations и return type declarations), нулевой объединяющий оператор (null coalescing operator), и другие улучшения.
PHP 7.4 (2019): Добавление стрелочных функций (arrow functions), поддержка spread-оператора для массивов, а также улучшения в синтаксисе и производительности.
PHP 8.0 (2020): Множество новых возможностей, таких как JIT-компиляция для улучшения производительности, добавление строгой типизации для свойств классов, сопоставление шаблонов (match expression), и другие синтаксические улучшения.
Использует ли Laravel Symfony?
Да, Laravel широко использует компоненты фреймворка Symfony. Laravel, популярный PHP-фреймворк, использует несколько компонентов Symfony, чтобы предоставить надежную и богатую функциями основу для создания веб-приложений. Некоторые из компонентов Symfony, используемых в Laravel, включают:
HTTP Foundation: Этот компонент используется для обработки HTTP-запросов и ответов.
Консоль (Console): Командный интерфейс Artisan в Laravel построен с использованием компонента консоли Symfony.
Диспетчер событий (Event Dispatcher): Система обработки событий в Laravel работает на основе компонента диспетчера событий Symfony.
Файловая система (Filesystem): Компонент файловой системы Symfony используется для операций с файлами.
Внедрение зависимостей (Dependency Injection): Laravel использует контейнер внедрения зависимостей Symfony для управления зависимостями.
Да, Laravel широко использует компоненты фреймворка Symfony. Laravel, популярный PHP-фреймворк, использует несколько компонентов Symfony, чтобы предоставить надежную и богатую функциями основу для создания веб-приложений. Некоторые из компонентов Symfony, используемых в Laravel, включают:
HTTP Foundation: Этот компонент используется для обработки HTTP-запросов и ответов.
Консоль (Console): Командный интерфейс Artisan в Laravel построен с использованием компонента консоли Symfony.
Диспетчер событий (Event Dispatcher): Система обработки событий в Laravel работает на основе компонента диспетчера событий Symfony.
Файловая система (Filesystem): Компонент файловой системы Symfony используется для операций с файлами.
Внедрение зависимостей (Dependency Injection): Laravel использует контейнер внедрения зависимостей Symfony для управления зависимостями.
Cуперглобальные массивы.
Суперглобальные массивы в PHP — это предопределенные глобальные переменные, которые доступны из любой области видимости в скрипте. Некоторые из наиболее распространенных суперглобальных массивов в PHP:
1. $_GET: содержит переменные, переданные из строки запроса URL в качестве параметров. Они обычно используются для передачи данных через URL.
2. $_POST: содержит переменные, отправленные через HTTP POST-запросы. Этот массив обычно используется для передачи данных из формы на сервер.
3. $_SESSION: хранит переменные сессии пользователя. Эти данные могут быть доступны на протяжении всей сессии пользователя.
4. $_COOKIE: содержит переменные, переданные клиентом через HTTP-куки. Они обычно используются для сохранения долговременных данных о состоянии пользователя.
5. $_SERVER: содержит информацию о сервере и окружении, в котором выполняется текущий скрипт.
6. $_FILES: содержит информацию о файлах, загруженных на сервер через форму загрузки файлов.
Про остальные можно узнать в документации
Суперглобальные массивы в PHP — это предопределенные глобальные переменные, которые доступны из любой области видимости в скрипте. Некоторые из наиболее распространенных суперглобальных массивов в PHP:
1. $_GET: содержит переменные, переданные из строки запроса URL в качестве параметров. Они обычно используются для передачи данных через URL.
2. $_POST: содержит переменные, отправленные через HTTP POST-запросы. Этот массив обычно используется для передачи данных из формы на сервер.
3. $_SESSION: хранит переменные сессии пользователя. Эти данные могут быть доступны на протяжении всей сессии пользователя.
4. $_COOKIE: содержит переменные, переданные клиентом через HTTP-куки. Они обычно используются для сохранения долговременных данных о состоянии пользователя.
5. $_SERVER: содержит информацию о сервере и окружении, в котором выполняется текущий скрипт.
6. $_FILES: содержит информацию о файлах, загруженных на сервер через форму загрузки файлов.
Про остальные можно узнать в документации
Почему стоит избегать foreach ($array as &$value), если не требуется изменять массив?
Использование конструкции
⚠️ Почему стоит избегать
1. Сохранение ссылки после цикла
После завершения цикла переменная
2. Повторное использование переменной в последующих циклах
Если переменная, использованная в качестве ссылки в одном цикле, повторно используется в следующем
3. Непреднамеренные изменения при передаче массива в функции
Если массив передаётся в функцию после использования
✅ Рекомендации
🔸 Используйте
🔸 Если необходимо изменить элементы, предпочтительнее использовать
🔸 После использования
🔸 Избегайте повторного использования переменной, использованной в
Использование конструкции
foreach ($array as &$value)
в PHP без необходимости изменения элементов массива может привести к неожиданным и труднообнаружимым ошибкам.⚠️ Почему стоит избегать
foreach
с ссылкой без необходимости1. Сохранение ссылки после цикла
После завершения цикла переменная
$value
остаётся ссылкой на последний элемент массива. Если затем использовать эту переменную без её предварительного удаления, это может непреднамеренно изменить последний элемент массива. Это поведение может привести к труднообнаружимым ошибкам. 2. Повторное использование переменной в последующих циклах
Если переменная, использованная в качестве ссылки в одном цикле, повторно используется в следующем
foreach
без ссылки, это может привести к неожиданным изменениям данных. Это связано с тем, что переменная остаётся ссылкой на последний элемент массива из предыдущего цикла. 3. Непреднамеренные изменения при передаче массива в функции
Если массив передаётся в функцию после использования
foreach
с ссылкой, и внутри функции также используется foreach
с ссылкой, это может привести к изменению оригинального массива, даже если он передан по значению. Это происходит потому, что переменная остаётся ссылкой, и при передаче массива в функцию изменения отражаются на оригинальном массиве. ✅ Рекомендации
🔸 Используйте
foreach ($array as $value)
без ссылки, если не планируете изменять элементы массива.🔸 Если необходимо изменить элементы, предпочтительнее использовать
foreach ($array as $key => $value)
и присваивать новые значения через $array[$key] = ...;
.🔸 После использования
foreach
с ссылкой всегда вызывайте unset($value);
для удаления ссылки. 🔸 Избегайте повторного использования переменной, использованной в
foreach
с ссылкой, в последующих циклах без её предварительного удаления.Что нового в РНР 8?
🚀 PHP 8.0
JIT-компиляция: Just-In-Time компилятор улучшает производительность, особенно в вычислительных задачах.
Атрибуты (аннотации): Позволяют добавлять метаданные к классам, методам и свойствам, улучшая читаемость и поддержку кода.
Сопоставление с образцом (match expression): Более строгая и удобная альтернатива конструкции
Промоция свойств конструктора: Уменьшает количество кода при объявлении свойств в конструкторе.
Объединённые типы (union types): Позволяют указывать несколько типов для параметров и возвращаемых значений.
Оператор nullsafe (
Новые строки функций:
Интерфейс
Функция
🔧 PHP 8.1
Перечисления (enums): Позволяют создавать наборы констант с типовой безопасностью.
Только для чтения свойства (
Тип
Синтаксис для первого класса callable: Упрощает создание и использование функций как объектов.
Fibers: Позволяют реализовывать кооперативную многозадачность, полезно для асинхронного кода.
🧪 PHP 8.2
Типы
Динамические свойства устарели: Предотвращает ошибки при случайном добавлении свойств в объекты.
Атрибут
🔍 PHP 8.3
Типизация констант классов: Позволяет задавать типы для констант внутри классов.
Атрибут
Глубокое копирование только для чтения свойств: Обеспечивает корректное поведение при копировании объектов.
Новые функции для работы с случайными значениями: Упрощают генерацию случайных данных.
🧩 PHP 8.4
Хуки свойств (Property Hooks): Возможность определять логику для геттеров и сеттеров непосредственно в свойстве, что упрощает код и уменьшает количество шаблонного кода.
Асимметричная видимость (Asymmetric Visibility): Позволяет задавать разные уровни доступа для чтения и записи свойств, например, сделать свойство доступным только для чтения.
Инстанцирование классов без скобок: Теперь можно вызывать методы сразу после создания объекта без необходимости оборачивать конструкцию в дополнительные скобки.
Новые функции для работы с массивами:
Поддержка HTML5 в расширении DOM: Расширение DOM теперь поддерживает HTML5, улучшая работу с современными веб-страницами.
Новые функции для работы со строками:
Поддержка HTTP/3 в cURL: Добавлены константы
Новые методы для DateTimeImmutable: Методы
🚀 PHP 8.0
JIT-компиляция: Just-In-Time компилятор улучшает производительность, особенно в вычислительных задачах.
Атрибуты (аннотации): Позволяют добавлять метаданные к классам, методам и свойствам, улучшая читаемость и поддержку кода.
Сопоставление с образцом (match expression): Более строгая и удобная альтернатива конструкции
switch
.Промоция свойств конструктора: Уменьшает количество кода при объявлении свойств в конструкторе.
Объединённые типы (union types): Позволяют указывать несколько типов для параметров и возвращаемых значений.
Оператор nullsafe (
?->
): Упрощает работу с возможными null
значениями, предотвращая ошибки.Новые строки функций:
str_contains()
, str_starts_with()
, str_ends_with()
— для удобной работы со строками.Интерфейс
Stringable
: Упрощает работу с объектами, которые могут быть приведены к строке.Функция
get_debug_type()
: Предоставляет точный тип переменной для отладки.🔧 PHP 8.1
Перечисления (enums): Позволяют создавать наборы констант с типовой безопасностью.
Только для чтения свойства (
readonly
): Свойства, которые можно инициализировать только один раз.Тип
never
: Указывает, что функция никогда не возвращает значение (например, всегда выбрасывает исключение).Синтаксис для первого класса callable: Упрощает создание и использование функций как объектов.
Fibers: Позволяют реализовывать кооперативную многозадачность, полезно для асинхронного кода.
🧪 PHP 8.2
Типы
null
, false
, true
как отдельные типы: Улучшает типовую безопасность.Динамические свойства устарели: Предотвращает ошибки при случайном добавлении свойств в объекты.
Атрибут
#[SensitiveParameter]
: Помечает параметры, содержащие чувствительную информацию, для предотвращения их логирования.🔍 PHP 8.3
Типизация констант классов: Позволяет задавать типы для констант внутри классов.
Атрибут
#[\Override]
: Указывает, что метод переопределяет родительский.Глубокое копирование только для чтения свойств: Обеспечивает корректное поведение при копировании объектов.
Новые функции для работы с случайными значениями: Упрощают генерацию случайных данных.
🧩 PHP 8.4
Хуки свойств (Property Hooks): Возможность определять логику для геттеров и сеттеров непосредственно в свойстве, что упрощает код и уменьшает количество шаблонного кода.
Асимметричная видимость (Asymmetric Visibility): Позволяет задавать разные уровни доступа для чтения и записи свойств, например, сделать свойство доступным только для чтения.
Инстанцирование классов без скобок: Теперь можно вызывать методы сразу после создания объекта без необходимости оборачивать конструкцию в дополнительные скобки.
Новые функции для работы с массивами:
array_find()
, array_find_key()
, array_any()
, array_all()
упрощают поиск и проверку элементов в массивах. Поддержка HTML5 в расширении DOM: Расширение DOM теперь поддерживает HTML5, улучшая работу с современными веб-страницами.
Новые функции для работы со строками:
mb_trim()
, mb_ucfirst()
, mb_lcfirst()
предоставляют дополнительные возможности для обработки многобайтовых строк. Поддержка HTTP/3 в cURL: Добавлены константы
CURL_HTTP_VERSION_3
и CURL_HTTP_VERSION_3ONLY
для работы с протоколом HTTP/3. Новые методы для DateTimeImmutable: Методы
createFromTimestamp()
и get/setMicrosecond()
облегчают работу с временными метками и микросекундами.Что подразумевается под понятием «триггер» в SQL?
Триггер в SQL — это предопределенный SQL-код, который автоматически выполняется (или «срабатывает») в ответ на определенные события в таблице или представлении базы данных. Триггеры могут быть использованы для автоматизации выполнения определенных действий при вставке, обновлении или удалении данных в таблице. Они предоставляют способ добавления бизнес-логики к базе данных.
Примеры событий, на которые могут реагировать триггеры:
AFTER INSERT (После вставки данных): Триггер срабатывает после вставки новой записи в таблицу.
AFTER UPDATE (После обновления данных): Триггер срабатывает после обновления существующей записи в таблице.
AFTER DELETE (После удаления данных): Триггер срабатывает после удаления записи из таблицы.
BEFORE INSERT (Перед вставкой данных): Триггер срабатывает перед вставкой новой записи в таблицу. Он может использоваться, чтобы модифицировать данные перед их вставкой.
BEFORE UPDATE (Перед обновлением данных): Триггер срабатывает перед обновлением существующей записи в таблице. Он может использоваться для проверки или модификации данных перед обновлением.
BEFORE DELETE (Перед удалением данных): Триггер срабатывает перед удалением записи из таблицы. Он может использоваться для проверки или сохранения данных перед удалением.
Триггер в SQL — это предопределенный SQL-код, который автоматически выполняется (или «срабатывает») в ответ на определенные события в таблице или представлении базы данных. Триггеры могут быть использованы для автоматизации выполнения определенных действий при вставке, обновлении или удалении данных в таблице. Они предоставляют способ добавления бизнес-логики к базе данных.
Примеры событий, на которые могут реагировать триггеры:
AFTER INSERT (После вставки данных): Триггер срабатывает после вставки новой записи в таблицу.
AFTER UPDATE (После обновления данных): Триггер срабатывает после обновления существующей записи в таблице.
AFTER DELETE (После удаления данных): Триггер срабатывает после удаления записи из таблицы.
BEFORE INSERT (Перед вставкой данных): Триггер срабатывает перед вставкой новой записи в таблицу. Он может использоваться, чтобы модифицировать данные перед их вставкой.
BEFORE UPDATE (Перед обновлением данных): Триггер срабатывает перед обновлением существующей записи в таблице. Он может использоваться для проверки или модификации данных перед обновлением.
BEFORE DELETE (Перед удалением данных): Триггер срабатывает перед удалением записи из таблицы. Он может использоваться для проверки или сохранения данных перед удалением.
Как устроен Singleton и почему его считают антипатерном?
Синглтон (Singleton) — это порождающий паттерн проектирования, который обеспечивает, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Теперь рассмотрим, почему Синглтон часто считают антипаттерном:
1️⃣Глобальное состояние: Использование глобального объекта (в данном случае, единственного экземпляра класса) может привести к созданию глобального состояния, что затрудняет тестирование и усложняет понимание потока управления программы.
2️⃣Сложность в тестировании: Синглтоны могут вызывать проблемы при тестировании, так как они создают глобальные зависимости, которые не всегда легко подменить для модульного тестирования.
3️⃣Проблемы с наследованием: Наследование от Синглтона может стать проблемой, так как он имеет статическую точку доступа, которая не всегда вписывается в иерархию наследования.
4️⃣Сложность в масштабировании: Использование Синглтона может затруднить масштабирование системы, так как он создает глобальную точку зависимости, которая может стать узким местом.
5️⃣Проблемы с потокобезопасностью: Реализации Синглтона, как правило, не потокобезопасны по умолчанию, что может привести к проблемам в многопоточных приложениях.
Синглтон (Singleton) — это порождающий паттерн проектирования, который обеспечивает, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Теперь рассмотрим, почему Синглтон часто считают антипаттерном:
1️⃣Глобальное состояние: Использование глобального объекта (в данном случае, единственного экземпляра класса) может привести к созданию глобального состояния, что затрудняет тестирование и усложняет понимание потока управления программы.
2️⃣Сложность в тестировании: Синглтоны могут вызывать проблемы при тестировании, так как они создают глобальные зависимости, которые не всегда легко подменить для модульного тестирования.
3️⃣Проблемы с наследованием: Наследование от Синглтона может стать проблемой, так как он имеет статическую точку доступа, которая не всегда вписывается в иерархию наследования.
4️⃣Сложность в масштабировании: Использование Синглтона может затруднить масштабирование системы, так как он создает глобальную точку зависимости, которая может стать узким местом.
5️⃣Проблемы с потокобезопасностью: Реализации Синглтона, как правило, не потокобезопасны по умолчанию, что может привести к проблемам в многопоточных приложениях.
🔥 IT Breaking Memes — 30 000 ₽ за самую смешную IT-новость
Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🏆 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
Пример:
Реальная новость: «Гугл создала модель для общения с дельфинами».
Смешная альтернатива: «Нейросеть от Гугл обрабатывает видеопоток с камеры в свинарнике. ИИ следит, сколько свинья находится возле кормушки, не отталкивают ли ее собратья. Недокормленных докармливают, а переевшие пропускают следующую кормешку».
📅 Сроки: с 29 апреля по 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Ждем ваших новостей!
Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🏆 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
Пример:
Реальная новость: «Гугл создала модель для общения с дельфинами».
Смешная альтернатива: «Нейросеть от Гугл обрабатывает видеопоток с камеры в свинарнике. ИИ следит, сколько свинья находится возле кормушки, не отталкивают ли ее собратья. Недокормленных докармливают, а переевшие пропускают следующую кормешку».
📅 Сроки: с 29 апреля по 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Ждем ваших новостей!
Когда Symfony отказывает пользователю в доступе?
Когда неавторизованный пользователь пытается получить доступ к веб-приложению, Symfony отказывает ему в доступе. Он отображает страницу ошибки и возвращает HTTP-статус 403. Ошибка Access Denied, как следует из названия, на веб-странице означает, что веб-сервер отклонил ваш запрос на просмотр, либо потому, что веб-сервер работает неправильно, либо потому, что у вас нет правильных учетных данных.
Когда неавторизованный пользователь пытается получить доступ к веб-приложению, Symfony отказывает ему в доступе. Он отображает страницу ошибки и возвращает HTTP-статус 403. Ошибка Access Denied, как следует из названия, на веб-странице означает, что веб-сервер отклонил ваш запрос на просмотр, либо потому, что веб-сервер работает неправильно, либо потому, что у вас нет правильных учетных данных.
Как защититься от SQL-инъекций без prepared statements?
🔐 Альтернативные способы защиты от SQL-инъекций без prepared statements
1. Экранирование пользовательского ввода
Для MySQL можно использовать функцию
Однако этот метод не защищает от всех видов атак и может быть недостаточно эффективным, особенно если не учитывать кодировку и типы данных.
2. Приведение типов и валидация данных
Если ожидается, что пользовательский ввод должен быть определённого типа (например, целое число), следует явно приводить его к этому типу и проверять допустимость значения.
Это предотвращает внедрение вредоносного кода через параметры, ожидающие числовые значения.
3. Белые списки допустимых значений
Для параметров, которые могут принимать ограниченный набор значений (например, порядок сортировки), следует использовать белые списки и проверять, что введённое значение входит в допустимый набор.
Это предотвращает возможность внедрения произвольного SQL-кода через параметры.
4. Использование хранимых процедур
Хранимые процедуры, определённые на стороне базы данных, могут помочь изолировать SQL-логику от пользовательского ввода. Однако они также могут быть уязвимы, если параметры не обрабатываются должным образом.
⚠️ Почему эти методы менее надёжны
🔸 Экранирование и валидация требуют тщательной реализации и могут быть легко нарушены при изменении кода.
🔸 Ошибки в логике проверки или упущенные случаи могут открыть путь для атак.
🔸 Эти методы не обеспечивают такой же уровень защиты, как подготовленные выражения, особенно при работе с различными типами данных и кодировками.
🔐 Альтернативные способы защиты от SQL-инъекций без prepared statements
1. Экранирование пользовательского ввода
Для MySQL можно использовать функцию
mysqli_real_escape_string()
, которая экранирует специальные символы в строке, делая её безопасной для использования в SQL-запросах.$login = mysqli_real_escape_string($conn, $_POST['login']);$query = «SELECT * FROM users WHERE login = '$login'»;
Однако этот метод не защищает от всех видов атак и может быть недостаточно эффективным, особенно если не учитывать кодировку и типы данных.
2. Приведение типов и валидация данных
Если ожидается, что пользовательский ввод должен быть определённого типа (например, целое число), следует явно приводить его к этому типу и проверять допустимость значения.
$id = (int)$_GET['id'];$query = «SELECT * FROM products WHERE id = $id»;
Это предотвращает внедрение вредоносного кода через параметры, ожидающие числовые значения.
3. Белые списки допустимых значений
Для параметров, которые могут принимать ограниченный набор значений (например, порядок сортировки), следует использовать белые списки и проверять, что введённое значение входит в допустимый набор.
$order = $_GET['order'];if (!in_array($order, ['ASC', 'DESC'])) {$order = 'ASC';}$query = «SELECT * FROM products ORDER BY price $order»;
Это предотвращает возможность внедрения произвольного SQL-кода через параметры.
4. Использование хранимых процедур
Хранимые процедуры, определённые на стороне базы данных, могут помочь изолировать SQL-логику от пользовательского ввода. Однако они также могут быть уязвимы, если параметры не обрабатываются должным образом.
⚠️ Почему эти методы менее надёжны
🔸 Экранирование и валидация требуют тщательной реализации и могут быть легко нарушены при изменении кода.
🔸 Ошибки в логике проверки или упущенные случаи могут открыть путь для атак.
🔸 Эти методы не обеспечивают такой же уровень защиты, как подготовленные выражения, особенно при работе с различными типами данных и кодировками.
Какие типы связей в базе данных?
Существует три типа связей между таблицами в базе данных:
«Один-к-одному» или 1:1. Это означает, что каждой записи в первой таблице соответствует не более одной записи во второй таблице, и наоборот.
«Один-ко-многим» или 1:M. Это означает, что одному экземпляру сущности может соответствовать любое количество (M) экземпляров другой сущности.
«Многие-ко-многим» или M:N. Это означает, что нескольким экземплярам одной сущности может соответствовать несколько экземпляров другой сущности.
Существует три типа связей между таблицами в базе данных:
«Один-к-одному» или 1:1. Это означает, что каждой записи в первой таблице соответствует не более одной записи во второй таблице, и наоборот.
«Один-ко-многим» или 1:M. Это означает, что одному экземпляру сущности может соответствовать любое количество (M) экземпляров другой сущности.
«Многие-ко-многим» или M:N. Это означает, что нескольким экземплярам одной сущности может соответствовать несколько экземпляров другой сущности.
Почему
В PHP функция
🔍 Почему
Пустой массив
🔍 Почему
При приведении пустого массива к объекту
⚠️ Важность различия
В JSON пустой массив
✅ Как контролировать результат
🔸Чтобы получить пустой объект в JSON, приведите массив к объекту:
🔸 Чтобы получить пустой массив, используйте
Будьте осторожны с флагом
json_encode([]) === '[]'
, но json_encode((object)[]) === '{}'
?В PHP функция
json_encode()
преобразует структуры данных в строки JSON. Результат зависит от типа передаваемой структуры: массив или объект.🔍 Почему
json_encode([])
возвращает '[]'
Пустой массив
[]
в PHP интерпретируется как последовательный массив без ключей. При преобразовании в JSON он становится пустым массивом: '[]'
.🔍 Почему
json_encode((object)[])
возвращает '{}'
При приведении пустого массива к объекту
(object)[]
получается экземпляр класса stdClass
без свойств. При кодировании в JSON он становится пустым объектом: '{}'
.⚠️ Важность различия
В JSON пустой массив
'[]'
и пустой объект '{}'
— разные типы данных. Это различие может быть критичным при взаимодействии с API или клиентскими приложениями, ожидающими определённый тип данных.✅ Как контролировать результат
json_encode()
🔸Чтобы получить пустой объект в JSON, приведите массив к объекту:
(object)[]
.🔸 Чтобы получить пустой массив, используйте
[]
.Будьте осторожны с флагом
JSON_FORCE_OBJECT
, так как он преобразует все массивы в объекты, что может привести к нежелательным результатам.Как использовать каталог хранилищ в Laravel?
Laravel предоставляет каталог хранения, который можно использовать для хранения файлов и других данных, которые не должны быть общедоступными.
В этом примере мы сохраняем файл в каталоге
Laravel предоставляет каталог хранения, который можно использовать для хранения файлов и других данных, которые не должны быть общедоступными.
В этом примере мы сохраняем файл в каталоге
uploads
внутри каталога storage
с помощью метода store. Затем мы можем получить файл с помощью метода get и удалить его с помощью метода delete
.Forwarded from Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
🐘 Квиз для PHP-разработчиков: ответишь на все вопросы или сольешься?
Проверь свои знания PHP перед собеседованием: тест с вопросами о типах данных, функциях, директивах и классах. Идеально для разработчиков, готовящихся к техническому интервью.
👉 Пройти тест
Проверь свои знания PHP перед собеседованием: тест с вопросами о типах данных, функциях, директивах и классах. Идеально для разработчиков, готовящихся к техническому интервью.
👉 Пройти тест
Как в PHP очистить память?
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции
2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию
3. Использование
4. Использование
5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции
unset()
позволяет явно удалить переменную или ее элементы.2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию
unset()
или присвоить переменной пустое значение ($var = null
), чтобы удалить ссылку на массив и освободить память.3. Использование
unset()
после работы с объектами: Аналогично предыдущему пункту, нужно удалить ссылку на объект, чтобы очистить память. Если объект был инициализирован с помощью конструктора, то вызов unset()
может привести к вызову деструктора объекта.4. Использование
gc_collect_cycles()
: Функция gc_collect_cycles()
используется для принудительного вызова сборщика мусора, который освобождает память, занимаемую неиспользуемыми объектами и циклами ссылок.5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость
Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.
📅 Сроки: прием новостей до 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Осталась неделя — ждем ваших новостей!
Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.
📅 Сроки: прием новостей до 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Осталась неделя — ждем ваших новостей!
Google Docs
Конкурс на самую смешную IT-новость
Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!
Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переворачиваете её с ног на голову, чтобы смеялись…
Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переворачиваете её с ног на голову, чтобы смеялись…
Что означает сложность алгоритма?
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).