🔥 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) (потребляет память, пропорционально квадрату размера входных данных).
Что такое идемпотентность?
Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.
Это важное понятие для разработчиков, потому что идемпотентные операции обеспечивают безопасность и надежность системы, позволяя повторять запросы в случае, если они не достигли сервера или были обработаны, но клиент не получил ответа.
Вот несколько примеров идемпотентных операций:
1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.
2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.
3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.
Это важное понятие для разработчиков, потому что идемпотентные операции обеспечивают безопасность и надежность системы, позволяя повторять запросы в случае, если они не достигли сервера или были обработаны, но клиент не получил ответа.
Вот несколько примеров идемпотентных операций:
1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.
2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.
3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Как работает lazy loading и можно ли его реализовать в PHP?
Lazy loading (отложенная загрузка) — это паттерн проектирования, при котором инициализация объекта или загрузка ресурса откладывается до момента, когда он действительно потребуется. Это помогает оптимизировать использование памяти и повысить производительность, особенно при работе с тяжёлыми объектами или данными.
⚙️ Как работает lazy loading
Вместо немедленной загрузки всех зависимостей при создании объекта, lazy loading позволяет отложить эту операцию до первого обращения к нужному свойству или методу. Это особенно полезно, когда:
Загрузка ресурсоёмких данных (например, из базы данных) может быть не нужна в каждом случае.
Необходимо сократить время отклика приложения.
Важно снизить потребление памяти, особенно при работе с большим количеством объектов.
🛠️ Реализация lazy loading в PHP
В PHP существует несколько подходов к реализации отложенной загрузки:
1. Ленивая инициализация (Lazy Initialization)
Значение свойства инициализируется только при первом обращении к нему. Это достигается проверкой, и если значение ещё не установлено, оно загружается и сохраняется для последующих обращений.
2. Виртуальный прокси (Virtual Proxy)
Создаётся объект-заместитель с тем же интерфейсом, что и реальный объект. При первом вызове метода прокси инициализирует реальный объект и делегирует ему вызов.
3. Призрачный объект (Ghost Object)
Объект создаётся в частично инициализированном состоянии, содержащем только идентификатор или минимальные данные. Полная инициализация происходит при первом обращении к дополнительным данным.
4. Хранитель значения (Value Holder)
Специальный объект, который управляет загрузкой значения по требованию. При обращении к значению он проверяет, загружено ли оно, и при необходимости выполняет загрузку.
5. Использование магических методов
В PHP можно переопределить магические методы
6. Встроенные механизмы в PHP 8.4
Начиная с PHP 8.4, появились встроенные механизмы для создания ленивых объектов с помощью методов
✅ Преимущества использования lazy loading
Экономия ресурсов: Загрузка данных происходит только при необходимости, что снижает потребление памяти и ресурсов процессора.
Повышение производительности: Сокращается время инициализации объектов и загрузки страницы или приложения.
Улучшение масштабируемости: Приложение может обрабатывать большее количество объектов без значительного увеличения потребления ресурсов.
⚠️ Возможные недостатки
Сложность отладки: Ошибки могут проявляться только при обращении к отложенно загруженным данным, что усложняет их обнаружение.
Проблемы с последовательностью загрузки: В случае взаимных зависимостей между объектами может возникнуть необходимость в дополнительной логике для предотвращения циклических вызовов.
Увеличение количества запросов: При частом обращении к отложенно загружаемым данным может увеличиться количество запросов к базе данных или другим ресурсам.
Таким образом, lazy loading — это эффективный инструмент для оптимизации ресурсов и повышения производительности PHP-приложений, особенно при работе с большими объёмами данных или сложными структурами объектов. Однако его использование требует внимательного подхода к проектированию архитектуры приложения и учёта возможных сложностей.
Lazy loading (отложенная загрузка) — это паттерн проектирования, при котором инициализация объекта или загрузка ресурса откладывается до момента, когда он действительно потребуется. Это помогает оптимизировать использование памяти и повысить производительность, особенно при работе с тяжёлыми объектами или данными.
⚙️ Как работает lazy loading
Вместо немедленной загрузки всех зависимостей при создании объекта, lazy loading позволяет отложить эту операцию до первого обращения к нужному свойству или методу. Это особенно полезно, когда:
Загрузка ресурсоёмких данных (например, из базы данных) может быть не нужна в каждом случае.
Необходимо сократить время отклика приложения.
Важно снизить потребление памяти, особенно при работе с большим количеством объектов.
🛠️ Реализация lazy loading в PHP
В PHP существует несколько подходов к реализации отложенной загрузки:
1. Ленивая инициализация (Lazy Initialization)
Значение свойства инициализируется только при первом обращении к нему. Это достигается проверкой, и если значение ещё не установлено, оно загружается и сохраняется для последующих обращений.
2. Виртуальный прокси (Virtual Proxy)
Создаётся объект-заместитель с тем же интерфейсом, что и реальный объект. При первом вызове метода прокси инициализирует реальный объект и делегирует ему вызов.
3. Призрачный объект (Ghost Object)
Объект создаётся в частично инициализированном состоянии, содержащем только идентификатор или минимальные данные. Полная инициализация происходит при первом обращении к дополнительным данным.
4. Хранитель значения (Value Holder)
Специальный объект, который управляет загрузкой значения по требованию. При обращении к значению он проверяет, загружено ли оно, и при необходимости выполняет загрузку.
5. Использование магических методов
__get()
и __isset()
В PHP можно переопределить магические методы
__get()
и __isset()
для отложенной загрузки свойств объекта. При обращении к неинициализированному свойству __get()
может выполнить необходимую загрузку и вернуть значение.6. Встроенные механизмы в PHP 8.4
Начиная с PHP 8.4, появились встроенные механизмы для создания ленивых объектов с помощью методов
ReflectionClass::newLazyGhost()
и ReflectionClass::newLazyProxy()
. Эти методы позволяют создавать объекты, которые инициализируются только при первом обращении к их свойствам или методам. ✅ Преимущества использования lazy loading
Экономия ресурсов: Загрузка данных происходит только при необходимости, что снижает потребление памяти и ресурсов процессора.
Повышение производительности: Сокращается время инициализации объектов и загрузки страницы или приложения.
Улучшение масштабируемости: Приложение может обрабатывать большее количество объектов без значительного увеличения потребления ресурсов.
⚠️ Возможные недостатки
Сложность отладки: Ошибки могут проявляться только при обращении к отложенно загруженным данным, что усложняет их обнаружение.
Проблемы с последовательностью загрузки: В случае взаимных зависимостей между объектами может возникнуть необходимость в дополнительной логике для предотвращения циклических вызовов.
Увеличение количества запросов: При частом обращении к отложенно загружаемым данным может увеличиться количество запросов к базе данных или другим ресурсам.
Таким образом, lazy loading — это эффективный инструмент для оптимизации ресурсов и повышения производительности PHP-приложений, особенно при работе с большими объёмами данных или сложными структурами объектов. Однако его использование требует внимательного подхода к проектированию архитектуры приложения и учёта возможных сложностей.