Как стать автором
Обновить

Комментарии 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 добавили короткие лямбды.


Ни в коем случае не умаляю работы над языком, но запоздание фичи довольно-таки велико.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Ещё лет через 5 придумают полноценные короткие лямбды, многострочные.
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 анонимную функцию (а теперь и стрелочную функцию). Но не стоит злоупотреблять анонимными функциями. Именованные функции несут важную миссию- они добавляют контекст и семантику коду, и вам не требуется лезть в реализацию функции, чтобы понять что она делает.

Совершенно непонятно что такое:
$order->price + $order->price * $vat;

А так понятно:
$order->getPriceWithTaxes();

Или с использованием функции (если точности чисел с плавающей точкой достаточно):
function getPriceWithTaxes(float $price, float $taxes): float;
На то оно и программирование, что существует множество вариантов.
Вот пример из оф. документации

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
?>
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации