Pull to refresh

Comments 12

Классная статья, прям то, чего не хватало по пайпам в новой версии пыхи. Не просто «вот новый синтаксис», а с акцентом на подводные камни и реальные ограничения, из-за которых легко наломать дров в проде. Нравится, что ты не агитируешь «тащить pipe везде», а честно пишешь, где он ухудшает читаемость и когда без замыканий лучше не лезть. Одним словом контент топ, давай еще статей)

Ну очевидный ИИшный бот же. Вот зачем? Ради продвижения канала?

кОпец даже не знаю комплимент или оскорбление

Вот только узнавать всё лучше в официальной документации.
А тут все примеры нерабочие, в вызове функций должен стоять spread-оператор.

$ php -r '$size = "Welcome to PHP!" |> strlen(); print $size;'
PHP Fatal error:  Uncaught ArgumentCountError: strlen() expects exactly 1 argument, 0 given in Command line code:1

$ php -r '$size = "Welcome to PHP!" |> strlen(...); print $size;'
15

Ну и якобы ошибки:
1, 3, 4 - пропущен spread. Если его поставить, то всё работает без дополнительного оборачивания в лямбду;
2 - у preg_match два обязательных аргумента, а в пайпе разрешены только функции с одним обязательным аргументом.

Честно говоря по ошибкам ничего не понятно, то ли примеры кривые, то ли комментарии.

$value |> decodeJson(); // Ошибка: Too many arguments

$value |> (fn($x) => decodeJson($x)); // решение

В чем решение, если внутри все также передаем в функцию атрибут? Записи равнозначны и ошибка должна быть такой же. К тому же если функция не принимает атрибутов - в чем смысл использовать с ней пайп?

$user |> $service->process(); // PHP интерпретирует как $service->process($user)

В комментарии ожидаемое на первый взгляд поведение, но это неверно же. PHP сначала выполнит $service->process(); и дальше либо упадет из-за не переданного обязательного аргумента, либо упадет из-за того что process не вернул callable с 1 аргументом, либо отработает, если результат process() - callable с единственным обязательным аргументом.

$data |> new DTO(); // PHP вызовет new DTO($data)

Это вариация прошлой ошибки, но PHP вызовет new DTO() - без передачи аргумента.

Сильно сбивает с толку.

Данные примеры из реальной жизни.

Это предостережения для вас читателей.

Как лучше не стоит не делать.

Код в данных участках сильно подвержен изменениям.

Скорее всего в какой-то момент расширится конструктор или набор входных аргументов.

Что в будущем может спровоцировать ошибки.

Именно в таких местах: конструкторы, методы объекта, наши кастомные функции.

Поэтому pipe лучше следует применять к функциям, которые "редко меняются" или по умолчанию просто оборачивать в анонимные функции, чтобы не спровоцировать ошибки

Если изменится сигнатура вызова, например, то у вас хоть вызов через пайп, хоть прямой, всё равно дадут ошибку. Ну или приведите пример обратного. Только потрудитесь свои примеры проверять, а не от балды их писать, как в статье.

Тут вся статья кривая. Если сделать как полагается, то всё работает без лямбд,

$value |> decodeJson(...);
$user |> $service->process(...);
$data |> new DTO(...);

Реально кривая статья. ИИ что ли писал? Как верно заметили выше, вместо обёрток надо использовать создание замыканий через многоточие.

Кстати, теперь у нас есть ещё и функция clone:

php -r 'var_dump((object) [] |> clone(...));'
object(stdClass)#2 (0) {
}

clone был и раньше. Сейчас его расширили, добавив второй параметр - ассоциативный массив со свойствами, которые будут изменены в копии. Это позволяет менять readonly-свойства при копировании.

Вы невнимательно читаете. Теперь есть ещё и функция clone.

О, кстати да, проверил только что, clone действительно стал функцией, а не function-like оператором (просто синтаксически похожим), как раньше думал, и его теперь можно в функции высшего порядка передавать.

Sign up to leave a comment.

Articles