PHP RFC: Marking return values as important (#[\NoDiscard])
За internals не успеть в последнее время! Вот уже на голосование вышел RFC от Tim Düsterhus и Volker Dusch. Они предлагают добавить в PHP атрибут
Возвращаемое значение считается использованным, если оно участвует в выражении или присваивании. Чтобы избежать предупреждения и явно в коде обозначить намерение не использовать результат вызова функции с
Использование
По мнению авторов, этот атрибут будет полезен для функций с сайд-эффектами, которые при этом ещё что-то возвращают, например, ошибки.
https://wiki.php.net/rfc/marking_return_value_as_important
За internals не успеть в последнее время! Вот уже на голосование вышел RFC от Tim Düsterhus и Volker Dusch. Они предлагают добавить в PHP атрибут
#[NoDiscard] — им можно будет пометить функции и методы, возвращаемое значение которых не стоит игнорировать. Например, вот такой код будет кидать E_WARNING, если RFC примут:
$date = new DateTimeImmutable('2024-1-1');
$date->setDate(2025, 1, 1); // E_WARNING
echo $date->format('Y'); // 2024
Возвращаемое значение считается использованным, если оно участвует в выражении или присваивании. Чтобы избежать предупреждения и явно в коде обозначить намерение не использовать результат вызова функции с
#[NoDiscard], авторы RFC предлагают добавить (void) каст. Он превратит выражение в инструкцию:
flock($stream, LOCK_EX); // E_WARNING
(void) flock($stream, LOCK_EX); // OK
if ((void) flock($stream, LOCK_EX)) {} // Parse error
Использование
#[NoDiscard] в функциях и методах, возвращающих void, never, а также в магических методах и хуках свойств приведёт к фатальной ошибке на этапе интерпретации.По мнению авторов, этот атрибут будет полезен для функций с сайд-эффектами, которые при этом ещё что-то возвращают, например, ошибки.
https://wiki.php.net/rfc/marking_return_value_as_important
👎75👍18🤔10🔥7
Пых
PHP RFC: Marking return values as important (#[\NoDiscard]) За internals не успеть в последнее время! Вот уже на голосование вышел RFC от Tim Düsterhus и Volker Dusch. Они предлагают добавить в PHP атрибут #[NoDiscard] — им можно будет пометить функции и…
Что я сам думаю по этому поводу?
Имхо, это такой же бесполезный атрибут, как и
По сути, это очередная проблема, которая должна решаться статическим анализом, а не рантаймом.
Имхо, это такой же бесполезный атрибут, как и
#[Override]. Никакого спроса лично у меня на эту фичу нет. Наверное, потому, что мои функции либо не мутируют стейт, либо возвращают void. Ну а к особенностям нативного апи я давно привык.По сути, это очередная проблема, которая должна решаться статическим анализом, а не рантаймом.
👍49💯10🔥4👎2
В честь 8 марта я немножко помучил Midjourney:
С праздником, дорогие подписчицы!💙
This is the logo of my Telegram channel about PHP in the form of an elephant. Add a flower to its trunk. Please keep the same image style.
С праздником, дорогие подписчицы!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤64🔥23👍22🍓5💩3
Media is too big
VIEW IN TELEGRAM
Коллекционный PHP-слоник 💙 Пых!
Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам.
Я давно мечтал о слоне для Пыха, и в конце прошлого года благодаря Сергею Пантелееву мне удалось заказать прототип: аккуратного синего слоника с логотипом канала на боку и белыми лапками.
Чтобы запустить в производство целую партию, я решил создать краудфандинговую кампанию! Среди вознаграждений — слоник Пых, слоник PHP 8 Сергея, та самая долгожданная лекция по Message Bus и личная встреча со мной. Переходите по ссылке и принимайте участие. Буду бесконечно рад, если у нас получится воплотить в жизнь этот проект!💙
https://planeta.ru/campaigns/phpyh_slon
Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам.
Я давно мечтал о слоне для Пыха, и в конце прошлого года благодаря Сергею Пантелееву мне удалось заказать прототип: аккуратного синего слоника с логотипом канала на боку и белыми лапками.
Чтобы запустить в производство целую партию, я решил создать краудфандинговую кампанию! Среди вознаграждений — слоник Пых, слоник PHP 8 Сергея, та самая долгожданная лекция по Message Bus и личная встреча со мной. Переходите по ссылке и принимайте участие. Буду бесконечно рад, если у нас получится воплотить в жизнь этот проект!
https://planeta.ru/campaigns/phpyh_slon
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43👍32❤7👏7
Пых
Коллекционный PHP-слоник 💙 Пых! Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам. Я давно мечтал о слоне для Пыха…
Ребята, мы уже собрали 25%! Я в шоке. Спасибо!
🔥34👏7🍾6❤4🫡2
Сумма прописью
В последнее время я частенько работаю с договорами. Когда в тексте нужно поменять сумму прописью, я использую первый попавшийся онлайн-сервис. Но вчера случайно обнаружил, что то же самое можно сделать в PHP одной консольной командой (должно быть установлено расширение
Сейчас вы в комментариях напишете, что я просто мог попросить "чатик" поправить мне договор. Но давайте не будем об этом.😅
Вообще
В последнее время я частенько работаю с договорами. Когда в тексте нужно поменять сумму прописью, я использую первый попавшийся онлайн-сервис. Но вчера случайно обнаружил, что то же самое можно сделать в PHP одной консольной командой (должно быть установлено расширение
intl):php -r "echo new NumberFormatter('ru', NumberFormatter::SPELLOUT)->format(12_345);"двенадцать тысяч триста сорок пять
Сейчас вы в комментариях напишете, что я просто мог попросить "чатик" поправить мне договор. Но давайте не будем об этом.
Вообще
intl умеет делать кучу полезных вещей, но этот факт всё время вылетает из головы. Наверняка существует огромное количество велосипедов, которые можно было бы заменить парой вызовов соответствующих функций.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥99👍53
Почему позднее связывание статическое?
В PHP есть такая фича, как позднее статическое связывание (late static binding или LSB). Она позволяет обратиться к вызываемому/инстанциированному классу в контексте наследования.
Когда-то давно для работы с LSB использовались функции forward_static_call, forward_static_call_array, get_called_class. Теперь всё это можно делать через
Обратимся к документации, чтобы разобраться в нейминге. Почему связывание "позднее"?
Ок, это понятно. Но почему "статическое" и почему
А вот тут не логично, согласитесь.
Тем не менее, мы с вами так привыкли к
В PHP есть такая фича, как позднее статическое связывание (late static binding или LSB). Она позволяет обратиться к вызываемому/инстанциированному классу в контексте наследования.
Когда-то давно для работы с LSB использовались функции forward_static_call, forward_static_call_array, get_called_class. Теперь всё это можно делать через
static:
/**
* @psalm-consistent-constructor
* @phpstan-consistent-constructor
*/
class A
{
final public static function staticClass(): string
{
return static::class;
}
final public static function newStatic(): static
{
return new static();
}
}
class B extends A {}
var_dump(
A::staticClass(), // "A"
A::newStatic(), // object(A)
A::newStatic()::staticClass(), // "A"
B::staticClass(), // "B"
B::newStatic(), // object(B)
B::newStatic()::staticClass(), // "B"
);
Обратимся к документации, чтобы разобраться в нейминге. Почему связывание "позднее"?
Природа названия «позднее статическое связывание» возникает из внутренней логики работы языка. Связывание называется «поздним», потому что конструкция static:: разрешается не в тот класс, в котором определили метод, а вычисляется на основе информации в ходе исполнения программы.Ок, это понятно. Но почему "статическое" и почему
static?Связывание также назвали «статическим», поскольку этот механизм в числе прочего умеет вызывать статические методы.
А вот тут не логично, согласитесь.
static — это про то, что метод/свойство доступны без объекта, а не про то, на какой класс мы ссылаемся. Гораздо лучше было бы взять called:: или late::. Документация объясняет, почему так вышло:Вместо введения нового ключевого слова для позднего статического связывания разработчики языка выбрали ключевое слово static, которое зарезервировали прежде.Тем не менее, мы с вами так привыкли к
static, что уже не чувствуем нелогичности этого нейминга...👍55💯13🔥6🤯5❤1👌1
Пых
Почему позднее связывание статическое? В PHP есть такая фича, как позднее статическое связывание (late static binding или LSB). Она позволяет обратиться к вызываемому/инстанциированному классу в контексте наследования. Когда-то давно для работы с LSB использовались…
self вместо static в финальных классах
Изначально я садился писать этот пост, но решил вас предварительно разогреть...😉
Представьте себе такую ситуацию:
Есть ли тут ошибка? Поначалу кажется, что есть. В интерфейсе сказано: нужно вернуть инстанс класса позднего статического связывания, а реализация использует более широкий тип
А теперь обратим внимание, что класс
Недавно подписчик Пыха @m1chael19 закинул PR с исправлением этого недоразумения. Фикс посчитали очень логичным и смерджили в 8.5 без RFC. Поздравим Михаила с первым контрибьютом в PHP!
https://github.com/php/php-src/pull/17724
https://3v4l.org/qWDQY/rfc#vgit.master
Изначально я садился писать этот пост, но решил вас предварительно разогреть...
Представьте себе такую ситуацию:
interface A
{
public static function new(): static;
}
final class B implements A
{
public static function new(): self
{
return new self();
}
}
Есть ли тут ошибка? Поначалу кажется, что есть. В интерфейсе сказано: нужно вернуть инстанс класса позднего статического связывания, а реализация использует более широкий тип
self и поэтому нарушает LSP. PHP тоже так считает: https://3v4l.org/qWDQY.А теперь обратим внимание, что класс
B финальный! В цепочке наследования после B уже никого не может быть, это самый "поздний" возможный класс. В финальном классе всегда self =:= static. Так что ошибки на самом деле нет!Недавно подписчик Пыха @m1chael19 закинул PR с исправлением этого недоразумения. Фикс посчитали очень логичным и смерджили в 8.5 без RFC. Поздравим Михаила с первым контрибьютом в PHP!
https://github.com/php/php-src/pull/17724
https://3v4l.org/qWDQY/rfc#vgit.master
Please open Telegram to view this post
VIEW IN TELEGRAM
3v4l.org
Online PHP editor | output for qWDQY
Run your php code online; get statistics, vld output and compare output from all versions.
🔥93🎉40👍23🤔3
Друзья, я долго вынашивал этот план. Заручился поддержкой трёх родных ивент-компаний и сегодня принял окончательное решение:
В сентябре у нас будет Пых.Конф!
Подробности чуть позже.
В сентябре у нас будет Пых.Конф!
Подробности чуть позже.
🔥186👍38😱17🫡5🎃2🦄2🤯1
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude
На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует.
Встречаемся в ближайшую среду (26 марта) в
YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует.
Встречаемся в ближайшую среду (26 марта) в
19:00!YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
YouTube
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude
На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует.
Генератор контекста:…
Генератор контекста:…
5🔥79👍24❤6😱3
Пых
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет…
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude
Сегодня Павел Бучнев заставит меня попробовать Claude! Посмотрим, что из этого выйдет!
Стрим перенесли на час, присоединяйтесь в
YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
Генератор контекста: https://docs.ctxgithub.com/
Промпт: https://gist.github.com/butschster/1b7e597691cc1a6476b15dc120ecbddb
Сегодня Павел Бучнев заставит меня попробовать Claude! Посмотрим, что из этого выйдет!
Стрим перенесли на час, присоединяйтесь в
20:00.YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
Генератор контекста: https://docs.ctxgithub.com/
Промпт: https://gist.github.com/butschster/1b7e597691cc1a6476b15dc120ecbddb
YouTube
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude
На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует.
Генератор контекста:…
Генератор контекста:…
🔥27👍6💩3😁1
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection
Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко.
Приходите в 18, разогрею вас перед стримом фартанов!
https://youtu.be/viWYmUUsD5I
https://vkvideo.ru/video-228746873_456239037
Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко.
Приходите в 18, разогрею вас перед стримом фартанов!
https://youtu.be/viWYmUUsD5I
https://vkvideo.ru/video-228746873_456239037
YouTube
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection
Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал https://news.1rj.ru/str/open_source_php от Димы Дерепко.
0:00 Вступление
0:36 Пых.Конф в сентябре
2:24 Где мои слоны?
5:28 After…
0:00 Вступление
0:36 Пых.Конф в сентябре
2:24 Где мои слоны?
5:28 After…
👍4❤3🔥2
Пых
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко. Приходите в 18, разогрею…
Как подменить файл из autoload.files
Сегодня в конце стрима я написал в тикете Infection, почему мутация функций очень полезна. Один из мейнтейнеров поставил под вопрос возможность подмены оригинальных файлов из секциине на жену, а в код сгенерированного автолоадера Composer:
И придумал следующую лазейку:
Да, грязновато, но, похоже, это единственный способ добавить мутацию функций в Infection...
Готовы вместе со мной поработать в Цеху в эти выходные?! Ставьте💯 , если да!
Сегодня в конце стрима я написал в тикете Infection, почему мутация функций очень полезна. Один из мейнтейнеров поставил под вопрос возможность подмены оригинальных файлов из секции
autoload.files на мутированные. Ну а поскольку я обожаю такие вызовы, я пошёл смотреть if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
}И придумал следующую лазейку:
function disableAutoloadFile(string $vendorDir, string $file): void
{
/** @var array<non-empty-string, non-empty-string> */
$idToFileMap = require $vendorDir . '/composer/autoload_files.php';
$id = array_search(realpath($file), $idToFileMap);
if ($id === false) {
throw new LogicException("File `{$file}` is not registered in autoload.files");
}
if (isset($GLOBALS['__composer_autoload_files'][$id])) {
throw new LogicException("File `{$file}` is already loaded");
}
$GLOBALS['__composer_autoload_files'][$id] = true;
}
disableAutoloadFile(__DIR__ . '/vendor', __DIR__ . '/src/functions.php');
require_once $infectionTmp . '/functions_mutated.php';
require_once __DIR__ . '/vendor/autoload.php';
Да, грязновато, но, похоже, это единственный способ добавить мутацию функций в Infection...
Готовы вместе со мной поработать в Цеху в эти выходные?! Ставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Пых
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection
Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко.
Приходите в 18, разогрею…
Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко.
Приходите в 18, разогрею…
💯39👍17🥴12🔥7❤2😁2🥰1🤔1
Пых
Как подменить файл из autoload.files Сегодня в конце стрима я написал в тикете Infection, почему мутация функций очень полезна. Один из мейнтейнеров поставил под вопрос возможность подмены оригинальных файлов из секции autoload.files на мутированные. Ну а…
Open Source Цех #5 / Мутация функций в Infection
Через час в 15 жду всех в Цеху! Попробуем научить Infection мутировать функции, а заодно разберёмся, как работает замечательный фреймворк мутационного тестирования от Макса Рафалко.
YouTube: https://youtu.be/UTaRm_sZr_w
VK Видео: https://vkvideo.ru/video-228746873_456239039
Тикет: https://github.com/infection/infection/issues/1482
Задонатить: https://www.donationalerts.com/r/vudaltsov
Через час в 15 жду всех в Цеху! Попробуем научить Infection мутировать функции, а заодно разберёмся, как работает замечательный фреймворк мутационного тестирования от Макса Рафалко.
YouTube: https://youtu.be/UTaRm_sZr_w
VK Видео: https://vkvideo.ru/video-228746873_456239039
Тикет: https://github.com/infection/infection/issues/1482
Задонатить: https://www.donationalerts.com/r/vudaltsov
YouTube
Open Source Цех #5 / Мутация функций в Infection
В этом выпуске Цеха мы с вами попробуем научить Infection мутировать функции! Заодно поймём в нюансах, как работает этот замечательный фреймворк мутационного тестирования от Макса Рафалко.
Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
🔥15👍8❤3
Пых
Open Source Цех #5 / Мутация функций в Infection Через час в 15 жду всех в Цеху! Попробуем научить Infection мутировать функции, а заодно разберёмся, как работает замечательный фреймворк мутационного тестирования от Макса Рафалко. YouTube: https://youtu.be/UTaRm_sZr_w…
Open Source Цех #5 / Мутация функций в Infection
Залетайте в Цех, начинаю разбирать Infection!
YouTube: https://youtu.be/UTaRm_sZr_w
VK Видео: https://vkvideo.ru/video-228746873_456239039
Тикет: https://github.com/infection/infection/issues/1482
Задонатить: https://www.donationalerts.com/r/vudaltsov
Комментировать можно под этим постом.
Залетайте в Цех, начинаю разбирать Infection!
YouTube: https://youtu.be/UTaRm_sZr_w
VK Видео: https://vkvideo.ru/video-228746873_456239039
Тикет: https://github.com/infection/infection/issues/1482
Задонатить: https://www.donationalerts.com/r/vudaltsov
Комментировать можно под этим постом.
YouTube
Open Source Цех #5 / Мутация функций в Infection
В этом выпуске Цеха мы с вами попробуем научить Infection мутировать функции! Заодно поймём в нюансах, как работает этот замечательный фреймворк мутационного тестирования от Макса Рафалко.
Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
🔥9👍4💩1
Пых
Коллекционный PHP-слоник 💙 Пых! Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам. Я давно мечтал о слоне для Пыха…
Последняя возможность купить 💙 слона!
В прошлую среду кампания по сбору средств на партию коллекционных слоников Пых достигла финансовой цели, преодолев порог в ₽400к! Это очень круто, я не ожидал, что всё получится так быстро — спасибо вам огромное за такую мощную поддержку!
Производство стартовало ещё на прошлой неделе, ориентировочная дата завершения — 1 июля. С учётом доставки партии из Иркутска в Москву, я надеюсь, что начну вам отправлять слоников уже 7 июля.
А теперь радостные новости по поводу лекции. Сегодня я связался с менеджером planeta.ru, объяснил, что нам нет смысла ждать 20 апреля, и она согласилась завершить проект досрочно — 2 апреля!
Это означает, что у тех, кто ещё не заказал слоника, осталось 3 дня, чтобы поддержать проект. А я тем временем начинаю готовиться к лекции по MessageBus. До встречи!
https://planeta.ru/campaigns/phpyh_slon
В прошлую среду кампания по сбору средств на партию коллекционных слоников Пых достигла финансовой цели, преодолев порог в ₽400к! Это очень круто, я не ожидал, что всё получится так быстро — спасибо вам огромное за такую мощную поддержку!
Производство стартовало ещё на прошлой неделе, ориентировочная дата завершения — 1 июля. С учётом доставки партии из Иркутска в Москву, я надеюсь, что начну вам отправлять слоников уже 7 июля.
А теперь радостные новости по поводу лекции. Сегодня я связался с менеджером planeta.ru, объяснил, что нам нет смысла ждать 20 апреля, и она согласилась завершить проект досрочно — 2 апреля!
Это означает, что у тех, кто ещё не заказал слоника, осталось 3 дня, чтобы поддержать проект. А я тем временем начинаю готовиться к лекции по MessageBus. До встречи!
https://planeta.ru/campaigns/phpyh_slon
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34👍9👏7❤1🍌1
Пых
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко. Приходите в 18, разогрею…
Смерджили мой PR в Brick\Math с Open Source Цеха #4!
https://github.com/brick/math/pull/90
Суть изменения тривиальна: сузить возвращаемый тип
Сначала на стриме я попробовал по-честному расставить типы по всей внутрянке, но упёрся в то, что в местах конкатенации
BenMorel согласился с моими доводами и зарелизил улучшение в 0.13.1.
Процесс контрибьютинга от форка до PR:
https://youtu.be/viWYmUUsD5I?t=3900s
https://vkvideo.ru/video-228746873_456239037?t=1h7m20s
https://github.com/brick/math/pull/90
Суть изменения тривиальна: сузить возвращаемый тип
BigInteger::__toString() и BigDecimal::__toString() до numeric-string, чтобы после приведения к строке значения можно было передавать в numeric-string и non-empty-string параметры (мне это потребовалось в недрах Typhoon).Сначала на стриме я попробовал по-честному расставить типы по всей внутрянке, но упёрся в то, что в местах конкатенации
numeric-string не выводится и его нужно форсить (прописывать @var или assert). В итоге предложил автору лёгкий путь: зафорсить тип только в самом методе __toString() и больше ничего не менять.BenMorel согласился с моими доводами и зарелизил улучшение в 0.13.1.
Процесс контрибьютинга от форка до PR:
https://youtu.be/viWYmUUsD5I?t=3900s
https://vkvideo.ru/video-228746873_456239037?t=1h7m20s
GitHub
Force numeric-string return type in BigDecimal::__toString() and BigInteger::__toString() by vudaltsov · Pull Request #90 · brick/math
Closes #89.
@return numeric-string cannot be added to BigRational, because '10/20' is not a numeric string. So I added numeric-string to BigDecimal and BigInteger classes only. This...
@return numeric-string cannot be added to BigRational, because '10/20' is not a numeric string. So I added numeric-string to BigDecimal and BigInteger classes only. This...
👍38🔥15❤5🏆2❤🔥1🤣1