Это мой персональный дневник. Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Модуль 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);

Как по мне, очень хорошее решение, совершенно непонятно почему оно ещё не в языке.