PHP 8.1
На прошлой неделе вышла новая версия PHP 8.1 с множеством улучшений.
Обновления PHP последние годы очень радуют! Язык становится еще мощнее, быстрее. Новые возможности приносят еще больше удовольствия при разработке проектов.
Ура, товарищи!
https://www.php.net/releases/8.1/ru.php
#php
На прошлой неделе вышла новая версия PHP 8.1 с множеством улучшений.
Обновления PHP последние годы очень радуют! Язык становится еще мощнее, быстрее. Новые возможности приносят еще больше удовольствия при разработке проектов.
Ура, товарищи!
https://www.php.net/releases/8.1/ru.php
#php
Шпаргалка по PHP
Краткое изложение современных возможностей PHP
https://front-line-php.com/cheat-sheet
#php
Краткое изложение современных возможностей PHP
https://front-line-php.com/cheat-sheet
#php
👍7
Сравнение объектов в PHP
Оператор сравнения
- Объекты являются экземплярами одного и того же класса.
- Все свойства объектов имею одинаковые значения.
Оператор идентичности
- Объекты являются экземплярами одного и того же класса.
- Объекты являются одним и тем же экземпляром.
- Все свойства объектов имею одинаковые значения.
https://www.php.net/manual/ru/language.oop5.object-comparison.php
#php
Оператор сравнения
==проверяет, что:
- Объекты являются экземплярами одного и того же класса.
- Все свойства объектов имею одинаковые значения.
Оператор идентичности
===проверяет, что:
- Объекты являются экземплярами одного и того же класса.
- Объекты являются одним и тем же экземпляром.
- Все свойства объектов имею одинаковые значения.
https://www.php.net/manual/ru/language.oop5.object-comparison.php
#php
👍7
Enum Style Guide
Размышления о том, как оформлять Enum в PHP.
Поддерживаю автора 👍
https://stitcher.io/blog/php-enum-style-guide
#php #enum
Размышления о том, как оформлять Enum в PHP.
Поддерживаю автора 👍
https://stitcher.io/blog/php-enum-style-guide
#php #enum
🔥3👏1
Пробуем атрибуты в PHP8
Хочу добавить с помощью атрибутов описания для классов и методов, чтобы автоматически добавлять их в базу данных.
https://stitcher.io/blog/attributes-in-php-8
#php #attributes
Хочу добавить с помощью атрибутов описания для классов и методов, чтобы автоматически добавлять их в базу данных.
https://stitcher.io/blog/attributes-in-php-8
#php #attributes
👍2❤1
Перенос строки
Бывает нужно вывести информацию в удобном виде с помощью переноса строки.
Для этого можно использовать симол переноса строки
Важно: двойные кавычки обязательны!
Однако есть другой способ - использовать константу
Она автоматически выведет тот символ переноса строки, который нужен для текущей платформы (linux/windows).
На скрине оба примера.
#php #eol
Бывает нужно вывести информацию в удобном виде с помощью переноса строки.
Для этого можно использовать симол переноса строки
"\n"(или
"\r\n"для windows).
Важно: двойные кавычки обязательны!
Однако есть другой способ - использовать константу
PHP_EOL, встроенную в PHP.
Она автоматически выведет тот символ переноса строки, который нужен для текущей платформы (linux/windows).
На скрине оба примера.
#php #eol
👍12
Удивительный язык PHP
Если не знал (или забыл), то в некоторых ситуациях можно передавать названия функций в виде строки и PHP их выполнит.
В данном случае мы передаём название функции
Не знаю насколько это правильно, но выглядит прикольно 😃
#php
Если не знал (или забыл), то в некоторых ситуациях можно передавать названия функций в виде строки и PHP их выполнит.
В данном случае мы передаём название функции
trimв виде строки вместо функции обратного вызова (последний пример).
Не знаю насколько это правильно, но выглядит прикольно 😃
#php
👍9
Запуск скрипта на PHP в безсерверной (serverless) среде на примере Digital Ocean 👍
https://php.watch/articles/php-serverless-digital-ocean
#php #serverless
https://php.watch/articles/php-serverless-digital-ocean
#php #serverless
👍2❤1🔥1
Агрегация вместо наследования
Большая, но интересная статья, которая по-шагам показывает минусы наследования и плюсы агрегации в ООП.
Как агрегация и ключевое слово final позволяют снизить зацепление, следовать SOLID и защитить код от неправильного использования.
Вконце даны полезные советы по тестированию кейсов без наследования.
Рекомендую👍
https://habr.com/ru/post/482154/
#oop #php #solid
Большая, но интересная статья, которая по-шагам показывает минусы наследования и плюсы агрегации в ООП.
Как агрегация и ключевое слово final позволяют снизить зацепление, следовать SOLID и защитить код от неправильного использования.
Вконце даны полезные советы по тестированию кейсов без наследования.
Рекомендую
https://habr.com/ru/post/482154/
#oop #php #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
А ты знал, что PHP-функцию
В этом случае под капотом он просто приводит все значения массива к
В итоге вернёт новый массив с элементами, которые стали
Примеры на скрине ☝️
Лайк? Лайк!
#php
array_filterможно вызывать с одним массивом (без callback-функции)?
В этом случае под капотом он просто приводит все значения массива к
boolean.
В итоге вернёт новый массив с элементами, которые стали
trueпосле приведения.
Примеры на скрине ☝️
Лайк? Лайк!
#php
👍8
Изменение состояния сущности
Изображения (скрины) отправлю в следующем сообщении.
Наши модели и база данных содержат поля, отвечающие за состояние сущности.
Например, пользователь может быть заблокирован или РАЗблокирован.
Способ 1
В этом случае можно добавить в таблицу
Тогда админ сможет блокировать пользователя, переключая чекбокс в админке.
Этот пример я накидал на первом изображении 👇
Проблема
Рано или поздно админ спросит - а когда был заблокирован этот юзер?
Начинающий разработчик скорее всего пожмёт плечами и скажет, что таких данных нет.
А опытный разработчик заглянет в логи и ответит на поставленый вопрос.
Если, конечно, значения поля НЕ менялось напрямую в базе данных 😁
Решение
В любом случае ничего страшного НЕ произойдёт, но нормальный разработчик сделает выводы, что в следующий раз лучше сразу хранить дату и время блокировки юзера.
(Способ 2)
Для решения этой задачи, можно вместо
В таком случае мы получаем всё тоже самое (переключатель ```null/datetime```) + имеем дату блокировки пользователя.
Этот пример показан на втором изображении 👇
Признавайся, делал так?
Проблема
Однако этот способ тоже НЕ идеальный, потому что здесь есть дата блокировки пользователя, НО нет даты его РАЗблокировки 😁
Получается, что задача решена наполовину, а для нас (хацкеров) это НЕприемлемо.
Решение
Логичное решение - добавить отдельное поле для хранения времени изменения переключателя.
Способ 3
Этот вариант сочатает в себе оба предыдущих способа и, наверно, является наиболее универсальным.
Теперь главное НЕ забыть обновлять дату и время ```blocked_at``` в момент изменения поля
Внимание на третье изображение 👇
Проблема
Но помимо поля
И тут возникает логичный вопрос - добавлять дополнительное поле с временем изменения к каждому из полей юзера?
То есть по-хорошему, мы хотим знать какие поля менялись? когда менялись? и значения ДО и ПОСЛЕ?
Решение
Начинающий разработчик, возможно, действительно начнёт добавлять отдельные поля.
Хотя бы для некоторых свойств пользователя (самых важных).
Но мы же не такие? Мы будем думать над универсальным "оружием".
А кто-то пойдёт гуглить готовое решение. Лентяй 🫵
Способ 4
Все выходные мы думали над решением и есть же!
1. Можно создать отдельную модель, например
2. Привязываем эту модель к любой другой модели нашего приложения (через трейт HasChanges).
3. Указываем какие поля мы хотим отслеживать (через абстрактный метод в трейте).
4. На основе событий модели (created, updated) наш трейт автоматически записывает историю в базу данных (таблица changes).
5. Мы в любой момент видим лог всех изменения наших записей: дату, время, значения ДО и ПОСЛЕ.
Изображение НЕ прилагаю. Предлагаю тебе самому подумать на решением 😝
Итог
Подобное решение иногда раально упрощает жизнь.
Особенно, если пользователь заявляет, что его аккаунт взломали 😃
Мы можем увидеть: когда был вход, когда изменился email, пароль и тд.
Ставь лайк, если полезно! Может запишем видео на эту тему.
ПС: если руками лазить в базу, то тут ничего не поможет 😁
ППС: если ооочень хочется, то можно 😉
#php #laravel #db #bool #boolean
Изображения (скрины) отправлю в следующем сообщении.
Наши модели и база данных содержат поля, отвечающие за состояние сущности.
Например, пользователь может быть заблокирован или РАЗблокирован.
Способ 1
В этом случае можно добавить в таблицу
usersполе
blockedс типом
boolean.
Тогда админ сможет блокировать пользователя, переключая чекбокс в админке.
Этот пример я накидал на первом изображении 👇
Проблема
Рано или поздно админ спросит - а когда был заблокирован этот юзер?
Начинающий разработчик скорее всего пожмёт плечами и скажет, что таких данных нет.
А опытный разработчик заглянет в логи и ответит на поставленый вопрос.
Если, конечно, значения поля НЕ менялось напрямую в базе данных 😁
Решение
В любом случае ничего страшного НЕ произойдёт, но нормальный разработчик сделает выводы, что в следующий раз лучше сразу хранить дату и время блокировки юзера.
(Способ 2)
Для решения этой задачи, можно вместо
booleanдля поля
blockedиспользовать дату и время, например
timestampс возможностью НЕ указывать значение (nullable).
В таком случае мы получаем всё тоже самое (переключатель ```null/datetime```) + имеем дату блокировки пользователя.
Этот пример показан на втором изображении 👇
Признавайся, делал так?
Проблема
Однако этот способ тоже НЕ идеальный, потому что здесь есть дата блокировки пользователя, НО нет даты его РАЗблокировки 😁
Получается, что задача решена наполовину, а для нас (хацкеров) это НЕприемлемо.
Решение
Логичное решение - добавить отдельное поле для хранения времени изменения переключателя.
Способ 3
Этот вариант сочатает в себе оба предыдущих способа и, наверно, является наиболее универсальным.
Теперь главное НЕ забыть обновлять дату и время ```blocked_at``` в момент изменения поля
blocked.
Внимание на третье изображение 👇
Проблема
Но помимо поля
blockedу юзера есть много других полей.
И тут возникает логичный вопрос - добавлять дополнительное поле с временем изменения к каждому из полей юзера?
То есть по-хорошему, мы хотим знать какие поля менялись? когда менялись? и значения ДО и ПОСЛЕ?
Решение
Начинающий разработчик, возможно, действительно начнёт добавлять отдельные поля.
Хотя бы для некоторых свойств пользователя (самых важных).
Но мы же не такие? Мы будем думать над универсальным "оружием".
А кто-то пойдёт гуглить готовое решение. Лентяй 🫵
Способ 4
Все выходные мы думали над решением и есть же!
1. Можно создать отдельную модель, например
Change(изменение).
2. Привязываем эту модель к любой другой модели нашего приложения (через трейт HasChanges).
3. Указываем какие поля мы хотим отслеживать (через абстрактный метод в трейте).
4. На основе событий модели (created, updated) наш трейт автоматически записывает историю в базу данных (таблица changes).
5. Мы в любой момент видим лог всех изменения наших записей: дату, время, значения ДО и ПОСЛЕ.
Изображение НЕ прилагаю. Предлагаю тебе самому подумать на решением 😝
Итог
Подобное решение иногда раально упрощает жизнь.
Особенно, если пользователь заявляет, что его аккаунт взломали 😃
Мы можем увидеть: когда был вход, когда изменился email, пароль и тд.
Ставь лайк, если полезно! Может запишем видео на эту тему.
ПС: если руками лазить в базу, то тут ничего не поможет 😁
ППС: если ооочень хочется, то можно 😉
#php #laravel #db #bool #boolean
🔥4