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

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

НЛО прилетело и опубликовало эту надпись здесь

Да, стрелочные функции — это те же самые замыкания, но с некоторыми нюансами в логике.
Кусок функции find_implicit_binds_recursively, которая, в случае стрелочной функции, вызывается рекурсивно.


if (ast->kind == ZEND_AST_CLOSURE) {
        /* For normal closures add the use() list. */
        zend_ast_decl *closure_ast = (zend_ast_decl *) ast;
        zend_ast *uses_ast = closure_ast->child[1];
        if (uses_ast) {
            zend_ast_list *uses_list = zend_ast_get_list(uses_ast);
            uint32_t i;
            for (i = 0; i < uses_list->children; i++) {
                zend_hash_add_empty_element(&info->uses, zend_ast_get_str(uses_list->child[i]));
            }
        }
    } else if (ast->kind == ZEND_AST_ARROW_FUNC) {
        /* For arrow functions recursively check the expression. */
        zend_ast_decl *closure_ast = (zend_ast_decl *) ast;
        find_implicit_binds_recursively(info, closure_ast->child[2]);
    }

Возможно есть еще какие небольшие отличия во внутренностях, но это надо копать. В любом случае, стрелочная функция обрабатывается тем же опкодом DECLARE_LAMBDA_FUNCTION(а это "тупой" опкод, без ext значений), что и замыкание. Печаль.

НЛО прилетело и опубликовало эту надпись здесь
Тут есть еще кто-то, кому кажется, что из-за стрелочных функций падает читаемость?

На мой взгляд, php вообще находится с противоположной стороны дороги от логики, читаемости и эффективности.


Некоторые адепты данного языка пару раз заявляли "а нафига мне 2 и "2" различать в условиях, я хрен знает какие там данные в импортируемой excel таблице".
И библиотеки, к сожалению, по похожим принципам пишутся.

«Доктор, а откуда у вас такие картинки?»
Спасибо. Где бы еще подобного почитать? Чтоб не совсем хардкорный phpinternals, но с разбором и аналитикой.

У меня несколько статей есть :)
А так даже и не припомню, чтоб видел где. Собственно потому и сам взялся разбираться.

А как обстоят дела с замыканиями в функциях?
array_map(function($item){}, []);

Создаётся каждый раз при исполнении этой строки (т.е. если без цикла, то один раз), а потом array_map протаскивает замыкание внутрь себя и начинается интрисиковая магия. Как оно там внутри используется — надо лазить по исходникам.

rjhdby Интересует вариант а) для цикла и статического замыкания. Там все также? Или будет по лучше из-за отсутствия передачи контекста?

Статического — это которое создалось вне цикла, а используется внутри? Тогда всё ок.

Не совсем. Например так


class Foo 
{
    public function bar()
    {
        foreach($values as $value){
            doSomeStuff($value, static function($args) { closureBody });
        }
    }
}
Вопрос немного не по теме: а как вы вообще опкоды генерите?
Попытался найти решение: однозначного ответа не нашел, много разных инструментов. Вы какой использовали?
Позволю себе дополнить, что выдачу VLD очень легко смотреть на 3v4l.org
Спасибо!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий