Вышел большой пост о дженериках в php, почему многие разработчики желают иметь их в инструментарии и возможно ли это в принципе в PHP?
https://sergeymukhin.com/blog/dzeneriki-v-php
https://sergeymukhin.com/blog/dzeneriki-v-php
Sergeymukhin
Дженерики в PHP
Поговорим о дженериках в PHP, целесообразность и сложность их внедрения в существующее ядро языка
PHP 8.3 будет выпущен как обычно в конце ноября 2023 года. Как обычно начинаю пост о новом функционале и устаревании. Итак первое что известно на данный момент:
unserialize(): Вывод E_WARNING ошибок вместо E_NOTICE
До версии PHP 8.3 передача недопустимой строки в функцию unserialize() выдавала всего лишь уведомления PHP ( E_NOTICE) в определенных случаях, например, при синтаксических ошибках в сериализованной строке. Начиная с PHP 8.3 выдается предупреждение E_WARNING. Кроме того, некоторые условия ошибки функции serialize() также изменяются, чтобы выдавать E_WARNING:
https://sergeymukhin.com/blog/chto-novogo-v-php-83
unserialize(): Вывод E_WARNING ошибок вместо E_NOTICE
До версии PHP 8.3 передача недопустимой строки в функцию unserialize() выдавала всего лишь уведомления PHP ( E_NOTICE) в определенных случаях, например, при синтаксических ошибках в сериализованной строке. Начиная с PHP 8.3 выдается предупреждение E_WARNING. Кроме того, некоторые условия ошибки функции serialize() также изменяются, чтобы выдавать E_WARNING:
unserialize("invalid-string");
- PHP Notice: unserialize(): Error at offset 0 of 14 bytes //было
+ PHP Warning: unserialize(): Error at offset 0 of 14 bytes //стало
В идеале невозможность десериализации данной строки должна быть серьезной ошибкой и вызывать исключение. Однако для обеспечения обратной совместимости и упрощения путей обновления уровень ошибок в PHP 8.3 был увеличен, а в будущем возможно его обновление для создания исключений.https://sergeymukhin.com/blog/chto-novogo-v-php-83
Sergeymukhin
Что нового в PHP 8.3
PHP 8.3 был выпущен 23 ноября 2023 года. В нем есть улучшения классов только для чтения, новая функция json_validate(), дополнения к недавно добавленному классу Randomizer, обнаружение переполнения стека и многое другое.
Новая функция json_validate
В PHP 8.3 будет добавлена новая функция json_validate(), которая возвращает true или false в том случае, если заданная строка является допустимой строкой JSON. До PHP 8.3 единственным способом определить, является ли заданная строка допустимой строкой JSON, была попытка ее декодирования и проверка наличия каких-либо ошибок. Новая функция json_validate() использует тот же базовый синтаксический анализатор JSON, что и PHP, но потребует меньше памяти:
В PHP 8.3 будет добавлена новая функция json_validate(), которая возвращает true или false в том случае, если заданная строка является допустимой строкой JSON. До PHP 8.3 единственным способом определить, является ли заданная строка допустимой строкой JSON, была попытка ее декодирования и проверка наличия каких-либо ошибок. Новая функция json_validate() использует тот же базовый синтаксический анализатор JSON, что и PHP, но потребует меньше памяти:
json_validate('[1, 2, 3]'); //true
json_validate('{1, 2, 3]'); //falseРанее в обзоре новых функций PHP 8.2 я писал, что будут добавлены readonly классы (только для чтения),
на практике это означает, что все свойства этого класса будут доступны только для чтения. Это особенно полезно при использовании DTO или объектов-значений (Value Object), когда класс имеет только общедоступные свойства для чтения .
Другими словами, вместо того, чтобы писать это:
можно теперь писать:
более подробно можно почитать в новом посте https://sergeymukhin.com/blog/php-82-klassy-tolko-dlia-cteniia-readonly-classes
на практике это означает, что все свойства этого класса будут доступны только для чтения. Это особенно полезно при использовании DTO или объектов-значений (Value Object), когда класс имеет только общедоступные свойства для чтения .
Другими словами, вместо того, чтобы писать это:
class PostDTO
{
public function __construct(
public readonly string $noscript,
public readonly Status $status,
public readonly ?DateTimeImmutable $published_at = null,
) {}
}
можно теперь писать:
readonly class PostDTO
{
public function __construct(
public string $noscript,
public Status $status,
public ?DateTimeImmutable $published_at = null,
) {}
}
более подробно можно почитать в новом посте https://sergeymukhin.com/blog/php-82-klassy-tolko-dlia-cteniia-readonly-classes
Sergeymukhin
PHP 8.2: Классы только для чтения (Readonly Classes)
PHP 8.2 добавляет новый способ объявления классов: вы можете сделать их доступными только для чтения
К концу недели накатал пост про одну из фишек PHP 8.2
true, false и null как самостоятельные типы
До версии PHP 8.2 можно было использовать null и только false только как части Union Types:
Начиная с PHP 8.2 можно писать так и не будет ошибок:
false, true, null можно использовать как самостоятельный тип везде, где PHP принимает тип:
Более подробно в посте
https://sergeymukhin.com/blog/php-82-true-false-i-null-kak-samostoiatelnye-tipy
true, false и null как самостоятельные типы
До версии PHP 8.2 можно было использовать null и только false только как части Union Types:
function foo(): string|null {}
function strpos(): int|false {}class User extends Model
{
/**
* @return false
*/
public function isAdmin(): bool
{
return false;
}
}
Начиная с PHP 8.2 можно писать так и не будет ошибок:
class User extends Model
{
public function isAdmin(): false
{
return false;
}
}
false, true, null можно использовать как самостоятельный тип везде, где PHP принимает тип:
class Foo {
private true $processed;
private false $focused;
public function process(string|int|true $value): true {}
public function focus(int|false $value): false {}
}Более подробно в посте
https://sergeymukhin.com/blog/php-82-true-false-i-null-kak-samostoiatelnye-tipy
Sergeymukhin
PHP 8.2: true, false и null как самостоятельные типы
Итак, релиз PHP 8.2 выпущен, об этом официально объявила команда разработчиков PHP https://www.php.net/archive/2022.php#2022-12-08-1.
Давайте быстро пробежимся по новым функциям:
- null и false как самостоятельные типы
- true как самостоятельный тип
- Классы только для чтения
- Новое расширение для генерации случайных чисел Random
- Типы DNF (дизъюнктивных нормальных форм)
- Константы в трейтах
- Новые функции openssl_cipher_key_length и openssl_cipher_key_length
- Новая функция curl_upkeep
- Новая функция ini_parse_quantity
- Новая функция memory_reset_peak_usage
- Получение свойств перечислений в константных выражениях
- Устаревшие динамические свойства
- Редактирование параметров в бэк трейсах
- Изменения типа возвращаемого значения для DateTime
- str_split возвращает пустые массивы для пустых строк
- ksort(..., SORT_REGULAR) изменения порядка сортировки
- Устаревание utf8_encode() и utf8_decode()
- Устаревшие частично поддерживаемые вызываемые объекты
- Нечувствительный к локали strtolower() и strtoupper()
- Изменения подписи для нескольких методов SPL
- Новый модификатор "n" в PCRE
- Экранирование имени пользователя и пароля ODBC
- Устаревшая ${} интерполяция строк
- MySQLi больше не может быть скомпилирован с libmysqli
Более подробно можно почитать в статье https://sergeymukhin.com/blog/chto-novogo-v-php-82
Давайте быстро пробежимся по новым функциям:
- null и false как самостоятельные типы
- true как самостоятельный тип
- Классы только для чтения
- Новое расширение для генерации случайных чисел Random
- Типы DNF (дизъюнктивных нормальных форм)
- Константы в трейтах
- Новые функции openssl_cipher_key_length и openssl_cipher_key_length
- Новая функция curl_upkeep
- Новая функция ini_parse_quantity
- Новая функция memory_reset_peak_usage
- Получение свойств перечислений в константных выражениях
- Устаревшие динамические свойства
- Редактирование параметров в бэк трейсах
- Изменения типа возвращаемого значения для DateTime
- str_split возвращает пустые массивы для пустых строк
- ksort(..., SORT_REGULAR) изменения порядка сортировки
- Устаревание utf8_encode() и utf8_decode()
- Устаревшие частично поддерживаемые вызываемые объекты
- Нечувствительный к локали strtolower() и strtoupper()
- Изменения подписи для нескольких методов SPL
- Новый модификатор "n" в PCRE
- Экранирование имени пользователя и пароля ODBC
- Устаревшая ${} интерполяция строк
- MySQLi больше не может быть скомпилирован с libmysqli
Более подробно можно почитать в статье https://sergeymukhin.com/blog/chto-novogo-v-php-82
Sergeymukhin
Что нового в PHP 8.2
PHP 8.2 выпущен 8 декабря 2022 года. В этом посте мы рассмотрим все функции, улучшения производительности, изменения и устаревший функционал
Forwarded from Пых (Валентин Удальцов)
🔴 Начинаем стрим по PHP 8.2!
Подключайтесь и встречайте новый PHP вместе с нами!
https://youtu.be/cXdJxa2gxgo
Картинка из поста в светлом и тёмном вариантах!
Подключайтесь и встречайте новый PHP вместе с нами!
https://youtu.be/cXdJxa2gxgo
Картинка из поста в светлом и тёмном вариантах!
У нас тут начинают подъезжать новые утвержденные rfc по PHP 8.3. Один из них:
Функция gc_status() будет возвращать дополнительную информацию и Garbage Collector
Как вы знаете функция PHP gc_status() возвращает статистику сборщика мусора PHP, например, работает ли сборщик мусора, защищен ли сборщик мусора, а так же размер буфера. Эта информация может быть полезна при отладке долго работающих PHP-приложений для обнаружения проблем с использованием и оптимизации памяти.
На данный момент функция gc_status возвращает массив с четырьмя ключами:
runs - Количество запусков сборщика мусора.
collected - Количество собранных объектов.
threshold - Количество roots в буфере, которое вызовет сборку мусора.
roots - Текущее количество roots в буфере.
В PHP 8.3 функция возвращает четыре дополнительных поля:
running - true если сборщик мусора запущен, в противном случае false .
protected - true если сборщик мусора защищен и добавление root запрещено, в противном случае false
full - true если размер буфера сборщика мусора превышает GC_MAX_BUF_SIZE. В настоящее время установлено значение 0x40000000(= 1024³.)
buffer_size - Текущий размер буфера сборщика мусора.
Функция gc_status() будет возвращать дополнительную информацию и Garbage Collector
Как вы знаете функция PHP gc_status() возвращает статистику сборщика мусора PHP, например, работает ли сборщик мусора, защищен ли сборщик мусора, а так же размер буфера. Эта информация может быть полезна при отладке долго работающих PHP-приложений для обнаружения проблем с использованием и оптимизации памяти.
var_dump(gc_status());
array(4) {
["runs"]=>
int(0)
["collected"]=>
int(0)
["threshold"]=>
int(10001)
["roots"]=>
int(6)
}
На данный момент функция gc_status возвращает массив с четырьмя ключами:
runs - Количество запусков сборщика мусора.
collected - Количество собранных объектов.
threshold - Количество roots в буфере, которое вызовет сборку мусора.
roots - Текущее количество roots в буфере.
В PHP 8.3 функция возвращает четыре дополнительных поля:
running - true если сборщик мусора запущен, в противном случае false .
protected - true если сборщик мусора защищен и добавление root запрещено, в противном случае false
full - true если размер буфера сборщика мусора превышает GC_MAX_BUF_SIZE. В настоящее время установлено значение 0x40000000(= 1024³.)
buffer_size - Текущий размер буфера сборщика мусора.
👍3
PHP 8.3: Динамическое получение констант класса и Enum
Итак, PHP 8.3 позволит написать вот такой код:
И ничего не сломается, а как вы помните раньше динамически получить доступ к константе можно было только через:
Теперь в PHP 8.3 код будет валиден и выполняться как ожидается.
Более подробно в новом посте https://sergeymukhin.com/blog/php-83-dinamiceskoe-poluchenie-konstant-klassa-i-enum
Итак, PHP 8.3 позволит написать вот такой код:
class Invoice {
public const STATUS_COMPLETE = "complete";
}
$constName = "STATUS_COMPLETE";
echo Invoice::{$constName}; //"complete"И ничего не сломается, а как вы помните раньше динамически получить доступ к константе можно было только через:
echo \constant("MyClass::$constName");Теперь в PHP 8.3 код будет валиден и выполняться как ожидается.
Более подробно в новом посте https://sergeymukhin.com/blog/php-83-dinamiceskoe-poluchenie-konstant-klassa-i-enum
Sergeymukhin
PHP 8.3: Динамическое получение констант класса и Enum
PHP 8.3 и более поздние версии получат поддержку получение констант класса и элементов Enum через переменную с названием константы
Хей здорово гайз!
Хочу поделиться с вами, что ежедневный траффик моего блога на сайте ~200 человек, не считая одноразовых всплесков в 600-1000 человек из тематических каналов телеграма, типа Laravel и др.
Но я хочу довести эту цифру до 1000, это в идеале конечно, но хотя бы до 500 уников в день, увеличив текущую аудиторию в 2 раза (это на сайте, в канале мы пока уютно сидим в 21 человек))
Так вот как показывает практика 1 статья в месяц или даже в два не способствует выполнению этого плана, поэтому я решил немного сменить стратегию, ну может и себя немного подстегнуть в написании текстов, так вот хочу попробовать писать чаще, как минимум статью в неделю, а лучше наверное две.
В рамках выполнения плана был сделан редизайн сайта, и созданы комментарии, чтобы больше контактировать со своей аудиторией, собирать потребность народа в информации и готовить под это новые темы статей.
Поэтому завершаю эту неделю статьей о функции array_merge_recursive, чуть ниже, а от вас жду комментариев, хоть в канале к посту, хоть на сайте в статье
https://sergeymukhin.com/blog/funkciia-array-merge-recursive-v-php
Всем хороших выходных!
Хочу поделиться с вами, что ежедневный траффик моего блога на сайте ~200 человек, не считая одноразовых всплесков в 600-1000 человек из тематических каналов телеграма, типа Laravel и др.
Но я хочу довести эту цифру до 1000, это в идеале конечно, но хотя бы до 500 уников в день, увеличив текущую аудиторию в 2 раза (это на сайте, в канале мы пока уютно сидим в 21 человек))
Так вот как показывает практика 1 статья в месяц или даже в два не способствует выполнению этого плана, поэтому я решил немного сменить стратегию, ну может и себя немного подстегнуть в написании текстов, так вот хочу попробовать писать чаще, как минимум статью в неделю, а лучше наверное две.
В рамках выполнения плана был сделан редизайн сайта, и созданы комментарии, чтобы больше контактировать со своей аудиторией, собирать потребность народа в информации и готовить под это новые темы статей.
Поэтому завершаю эту неделю статьей о функции array_merge_recursive, чуть ниже, а от вас жду комментариев, хоть в канале к посту, хоть на сайте в статье
https://sergeymukhin.com/blog/funkciia-array-merge-recursive-v-php
Всем хороших выходных!
Sergeymukhin
Функция array_merge_recursive в PHP
Давайте поговорим о такой интересной функции как array_merge_recursive и пообсуждаем что же она делает
Обычно 8 марта не пишу каких-либо постов, это либо общие праздники типа нового года (хотя в этом году тоже забегался и не написал пост), либо тот же день разработчика,
Но как минимум в наших рядах есть одна девушка @YuliaYgorevna и я думаю нам не сложно от всего мужского коллектива нашего канала поздравить ее (а если есть ещё и другие подписчики-девушки, то и их тоже) с этим прекрасным днём, и пожелать чистого неба над головой, и всегда дарить своим близким лучи радости и красоты!
Все отдыхают в праздник или кто-то работает?)
Я например все пытаюсь добить пост с внятным объяснением генераторов с yield. Надеюсь скоро опубликую. 😀
Но как минимум в наших рядах есть одна девушка @YuliaYgorevna и я думаю нам не сложно от всего мужского коллектива нашего канала поздравить ее (а если есть ещё и другие подписчики-девушки, то и их тоже) с этим прекрасным днём, и пожелать чистого неба над головой, и всегда дарить своим близким лучи радости и красоты!
Все отдыхают в праздник или кто-то работает?)
Я например все пытаюсь добить пост с внятным объяснением генераторов с yield. Надеюсь скоро опубликую. 😀
👍2🔥1