OneCode
1.39K subscribers
628 photos
59 videos
3 files
524 links
Full Stack на PHP, Laravel и всё, что с этим связано.
YouTube: https://www.youtube.com/@onecode_blog
Download Telegram
PHP 8.1

На прошлой неделе вышла новая версия PHP 8.1 с множеством улучшений.

Обновления PHP последние годы очень радуют! Язык становится еще мощнее, быстрее. Новые возможности приносят еще больше удовольствия при разработке проектов.

Ура, товарищи!

https://www.php.net/releases/8.1/ru.php

#php
Шпаргалка по PHP

Краткое изложение современных возможностей PHP

https://front-line-php.com/cheat-sheet

#php
👍7
Сравнение объектов в 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
🔥3👏1
Пробуем атрибуты в PHP8

Хочу добавить с помощью атрибутов описания для классов и методов, чтобы автоматически добавлять их в базу данных.

https://stitcher.io/blog/attributes-in-php-8

#php #attributes
👍21
Перенос строки

Бывает нужно вывести информацию в удобном виде с помощью переноса строки.

Для этого можно использовать симол переноса строки
"\n"
(или
"\r\n"
для windows).

Важно: двойные кавычки обязательны!

Однако есть другой способ - использовать константу
PHP_EOL
, встроенную в PHP.

Она автоматически выведет тот символ переноса строки, который нужен для текущей платформы (linux/windows).

На скрине оба примера.

#php #eol
👍12
Удивительный язык PHP

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

В данном случае мы передаём название функции
trim
в виде строки вместо функции обратного вызова (последний пример).

Не знаю насколько это правильно, но выглядит прикольно 😃

#php
👍9
Начиная с PHP 8 появилось объединение типов (Union types).

Простыми словами - можно указывать сразу несколько типов для агрумента функции через символ
|
(пример на скрине).

Просто напомнил 😃

#php
🔥12👍4
Запуск скрипта на PHP в безсерверной (serverless) среде на примере Digital Ocean 👍

https://php.watch/articles/php-serverless-digital-ocean

#php #serverless
👍21🔥1
Агрегация вместо наследования

Большая, но интересная статья, которая по-шагам показывает минусы наследования и плюсы агрегации в ООП.

Как агрегация и ключевое слово final позволяют снизить зацепление, следовать SOLID и защитить код от неправильного использования.

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

Рекомендую 👍

https://habr.com/ru/post/482154/

#oop #php #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
3
В PHP 8.2 можно будет объявлять константы в трейтах! Реально несколько раз НЕ хватало этой возможности.

Вообще начиная с версии PHP 8 приходит очень много новых изменений (круто!), особенно мелких, про которые мало кто знает.

#php #php82
4
А ты знал, что PHP-функцию
array_filter
можно вызывать с одним массивом (без callback-функции)?

В этом случае под капотом он просто приводит все значения массива к
boolean
.

В итоге вернёт новый массив с элементами, которые стали
true
после приведения.

Примеры на скрине ☝️

Лайк? Лайк!

#php
👍8
Изменение состояния сущности

Изображения (скрины) отправлю в следующем сообщении.

Наши модели и база данных содержат поля, отвечающие за состояние сущности.

Например, пользователь может быть заблокирован или РАЗблокирован.

Способ 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