Комментарии 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){}, []);
Попытался найти решение: однозначного ответа не нашел, много разных инструментов. Вы какой использовали?
Vulcan Logic Dumper от Derick Rethans.
Анонимные функции в PHP: сеанс чёрной магии с разоблачением