Комментарии 20
нахрена оператор fn перед стрелочной функцией
$array = [ $a => $a + $b, $x => $x * $y, ];
Это массив arrow functions или map?
yield $foo => $bar;
Это key-value yield или arrow function yield?
Понятно, что можно ввести приоритеты и расставить скобочки — но это усложнение языка и способ наделать ошибок на пустом месте.
Я, если что, был за \($x) => ...
, как в Haskell. Но с fn тоже неплохо.
А если мне надо мапу вида ($a + $x) * $y => $a + $b? :-)
Понятно, что реализуемо, но слишком замороченно, не надо из PHP делать C++.
Это я бы тоже распарсил как обычный массив. А если нужен массив стрелочных функций, пришлось бы написать так:
$array = [
($a => $a + $b),
($x => $x * $y),
];
// то же, с yield:
yield ($foo => $bar);
welocme to JS =)
$posts->map(fn())
При голосовании сообщества на тему, что хотите видеть в PHP 8 скалярные объекты заняли 3 место с весомым процентом!
Шёл 2019 год. В PHP добавили короткие лямбды.
Ни в коем случае не умаляю работы над языком, но запоздание фичи довольно-таки велико.
class Post {
private $title;
fn getTitle() => $this->title;
}
Какой ужас. Давно же придумали лаконичный и однозначный синтаксис:
class Post {
private $title { get; protected set; }
}
Раньше нужно было писать так:
$ids = array_map(function ($post) { return $post->id; }, $posts);
До декабря 2015-го действительно так нужно было писать, зато начиная с php 7 можно писать гораздо проще:
array_column($collection, $property)
Начиная с 7.0 функция array_column в качестве входного параметра может принимать не только массив, но и коллекцию объектов. демо
Мне кажется что это более чистый и читабельный вариант, чем даже стрелочная функция.
Все верно, ваш вариант проще в конкретном примере, но если нужно что-то сложнее?
$vat = 0.2;
$total = array_sum(
array_map(
function (Order $order) use ($vat) {
return $order->price + $order->price * $vat;
},
$orders
)
);
$vat = 0.2;
$total = array_sum(
array_map(
fn (Order $order): float => $order->price + $order->price * $vat,
$orders
)
);
Я и не говорю, что array_column является решением на все случаи жизни, но единственную свою задачу получения поля из коллекции решает хорошо.
Если нужно вычислить какое-то выражение от поля, разумеется придется прибегнуть или к array_map или к аналогичному решению. Хорошо хоть проход в цикле по массиву с копированием значений во временную переменную в коде можно встретить все реже.
Хорошо, что есть возможность передать в array_map анонимную функцию (а теперь и стрелочную функцию). Но не стоит злоупотреблять анонимными функциями. Именованные функции несут важную миссию- они добавляют контекст и семантику коду, и вам не требуется лезть в реализацию функции, чтобы понять что она делает.
Совершенно непонятно что такое:
А так понятно:
Или с использованием функции (если точности чисел с плавающей точкой достаточно):
Если нужно вычислить какое-то выражение от поля, разумеется придется прибегнуть или к array_map или к аналогичному решению. Хорошо хоть проход в цикле по массиву с копированием значений во временную переменную в коде можно встретить все реже.
Хорошо, что есть возможность передать в array_map анонимную функцию (а теперь и стрелочную функцию). Но не стоит злоупотреблять анонимными функциями. Именованные функции несут важную миссию- они добавляют контекст и семантику коду, и вам не требуется лезть в реализацию функции, чтобы понять что она делает.
Совершенно непонятно что такое:
$order->price + $order->price * $vat;
А так понятно:
$order->getPriceWithTaxes();
Или с использованием функции (если точности чисел с плавающей точкой достаточно):
function getPriceWithTaxes(float $price, float $taxes): float;
На то оно и программирование, что существует множество вариантов.
Вот пример из оф. документации
Example #1 Anonymous function example
Который превращается в:
Вот пример из оф. документации
Example #1 Anonymous function example
<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld
?>
Который превращается в:
<?php
echo preg_replace_callback('~-([a-z])~', fn ($match) => strtoupper($match[1]), 'hello-world');
// outputs helloWorld
?>
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Стрелочные функции в PHP 7.4