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

Комментарии 12

О, первый раз услышал как Никита Попов по русски говорит)

Из всех вариантов коротких лямбд выбрали самый кривой…

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

fn helloWorder() => echo 'Hello world';
Это вообще разные вещи, зачем их рядом ставить?
В документе есть целая секция с обоснованием выбора синтаксиса wiki.php.net/rfc/arrow_functions_v2#syntax

а также секция про возможные улучшения в будущем wiki.php.net/rfc/arrow_functions_v2#allow_arrow_notation_for_real_functions
Вообще, можно было сделать просто fn алиасом на function, получилось бы более консистентно, имхо:
class X 
{
    public fn a() { ... }
    public function b() { ... }

    public fn c() => ...;
    public function d() => ...;
}

$a = function ($x) use ($z) { ... };
$b = fn($x) use ($z) { ... };

$c = function ($x) => ...;
$d = fn($x) => ...;


А отличия были бы только в "=>" vs "{}", в первом случае только одно выражение + захват контекста, а во втором много выражений + контекст через use.
А заодно и use отменить, раз захват контекста без него уже реализовали.

Захват контекста реализован не так, как use. В use можно использовать ссылку и менять исходную переменную. В fn => — по значению.
Хотя в rfc описан вариант (я так понимаю, на будущие релизы):


$fn = fn() use(&) {
    // ...
};
Не, будет 1, как $x, так и $y. Пробовал в devilbox/php-fpm-7.4:latest
Компилятор PHP, также известный как кроличья нора FFI — Интересный пост о типах компиляторов, принципах их устройства, и собственно о реализации ahead-of-time (AOT) компилятора PHP с использованием LLVM и самого PHP.


Это самое безумное и охренительное, что я когда-либо видел! А FFI биндинги под llvm с примерами использования вообще бесподобны.
$multipleLines = fn($x) => last(


Зачем объявлять функцию last() и временную переменную для решения проблемы со ссылкой в end()?
Смысл однострочника — в отсутствии деклараций:

$x = 1;
echo array_slice([
  $y = $x * 10,
  $z = $y + 15,
  $x + $y + $z
],-1)[0];
Добавил в текст, спасибо за дополнение!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации