Модуль scalar_objects
Очень мне нравится идея навести порядок в функциях ПХП при помощи присобачивания к примитивным типам что-то вроде методов.
К именованию встроенных функций есть много претензий:
- различный стиль наименований: html_entity_decode, но htmlentities;
- неинтуитивность некоторых названий: strcspn, strpbrk;
- разный порядок параметров: strpos($haystack, $needle), array_search($needle, $haystack);
Считается, что это один из серьёзных недостатков ПХП. Напрашивается очевидное решение — сделать всем проблемным функциям алиасы, но так язык замусорится ещё сильнее.
А вот добавив псевдометоды у примитивных типов, можно сразу сразу сделать хорошо. Один из контрибьютеров даже сделал модуль, который показывает как это могло бы выглядеть:
declare(strict_types=1);
class IntHandler {
public static function abs(int $self): int {
return abs($self);
}
public static function div(int $self, int $other): int {
return intdiv($self, $other);
}
public static function sqrt(int $self): float {
return sqrt($self);
}
}
register_primitive_type_handler('int', 'IntHandler');
$i = -5;
var_dump($i->abs()->div(2)->sqrt()); // 1.4142135623730951
Разумеется, если это решение поместить в язык, никаких классов регистрировать не надо будет, так что можно смотреть только на последнюю строку.
Кроме того, повышается читаемость. Сравните два подхода
$result = substr(strtr(rtrim($className, '_'), '\\', '_'), 15);
$result = $className->trimRight('_')->replace('\\', '_')->slice(15);
Как по мне, очень хорошее решение, совершенно непонятно почему оно ещё не в языке.