The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Релиз PHP 5.5.0, opennews (??), 21-Июн-13, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


274. "Релиз PHP 5.5.0"  +/
Сообщение от arisu (ok), 24-Июн-13, 13:56 
> В PHP начиная с версии 5.4 появилось много хороших вещей.

например, «замыкания», которым надо *руками* указывать, что они захватывают. голуби от хохота с проводов падают.

Ответить | Правка | Наверх | Cообщить модератору

275. "Релиз PHP 5.5.0"  +/
Сообщение от almadomundo (ok), 24-Июн-13, 14:22 
Это можно считать как плюсом, так и минусом.

С одной стороны - согласен, если нужно много сущностей того scope, в котором объявлено замыкание, а таковых сущностей порядка 10, то да, утомляет.
С другой стороны - если учесть, что параметры контекста могут быть именованы, а само замыкание - привязано к объекту (через bindTo) - то это хорошая возможность - поскольку предоставляет возможность использовать свойства объекта внутри замыкания. Я бы сказал, это компромисс - если мы хотим, чтобы было возможно второе, то придётся получить недостатки первого.
Наконец, если переменных настолько много, что перечисление их не представляется хорошей идеей, всегда есть get_defined_vars() - но, по правде, у меня никогда не возникало нужды передать замыканию контекст из более чем 3-4 переменных - в силу организации данных. Есть ведь массивы/объекты. Необязательно всё хранить в скалярах.

Ответить | Правка | Наверх | Cообщить модератору

276. "Релиз PHP 5.5.0"  +/
Сообщение от arisu (ok), 24-Июн-13, 14:30 
> Это можно считать как плюсом, так и минусом.

это минус. потому что заставляет выполнять руками задачу, с которой отлично справляется компилятор. все переменные из outer scope, которые используются внутри функции, попадают в замыкание. всё. если надо кого-то исключить — «затеняем» его локальной декларацией. но у похапэ… ОПА! нет локальных деклараций.

впрочем, и это обходится элементарным анализом байткода: если переменная из outer scope не используется до первого присваивания ей значения, то захватывать её не надо. костыль, конечно, но в большинстве случаев будет работать и позволит не вводить новый синтаксис.

Ответить | Правка | Наверх | Cообщить модератору

281. "Релиз PHP 5.5.0"  +/
Сообщение от AlexAT (ok), 24-Июн-13, 14:48 
> это минус. потому что заставляет выполнять руками задачу, с которой отлично справляется
> компилятор. все переменные из outer scope, которые используются внутри функции, попадают
> в замыкание. всё. если надо кого-то исключить — «затеняем» его локальной
> декларацией. но у похапэ… ОПА! нет локальных деклараций.

Это концепция языка - у него только принудительное наследование между scope'ами.
Где-то она неудобна, да. Но реально - в ряде случаев страхует от весьма трудноуловимых багов (переменная объявлена в глобальном контексте, не объявлена в локальном, но используется как локальная).

Ответить | Правка | Наверх | Cообщить модератору

283. "Релиз PHP 5.5.0"  +/
Сообщение от arisu (ok), 24-Июн-13, 14:52 
она везде неудобна, потому что заставляет делать за машину её работу. с таким же успехом я могу собрать всё, что мне надо, в массив/новый объект и передавать его, например.

а если попроще — то это «мы не поняли, зачем нужны замыкания, поэтому сделали в меру своего непонимания». в итоге вместо облегчения жизни добавили костылей.

Ответить | Правка | Наверх | Cообщить модератору

277. "Релиз PHP 5.5.0"  +/
Сообщение от arisu (ok), 24-Июн-13, 14:32 
алсо, bintTo() не нужен. достаточно иметь нормальные nested functions, и тогда такие «биндеры» элементарно пишутся на самом языке. но у похапэ традиция костылестроения.
Ответить | Правка | К родителю #275 | Наверх | Cообщить модератору

278. "Релиз PHP 5.5.0"  +/
Сообщение от almadomundo (ok), 24-Июн-13, 14:39 
Не соглашусь. Использование переменных внутри тела замыкания неявно привязывает его к контексту. А с именованными параметрами мы получаем вполне себе переносимый код, одновременно корректно работающий с контекстом и не зависящий от него. Правда, думаю, это вопрос вкуса - ведь можно в принципе и новое замыкание объявить.

Насчёт nested functions и bindTo - не уловил идеи. Можете подробнее?

Ответить | Правка | Наверх | Cообщить модератору

280. "Релиз PHP 5.5.0"  +/
Сообщение от arisu (ok), 24-Июн-13, 14:45 
> Не соглашусь. Использование переменных внутри тела замыкания неявно привязывает его к контексту.

эм... это и есть суть замыканий: захватить с собой контекст.

> А с именованными параметрами мы получаем вполне себе переносимый код, одновременно
> корректно работающий с контекстом и не зависящий от него.

это, пардон май фрэнч, фигня какая-то. странная помесь недозамыканий и dynamic scoping.

> Правда, думаю,
> это вопрос вкуса - ведь можно в принципе и новое замыкание
> объявить.

и можно, и нужно. не надо превращать замыкания в непонятных монстров.

> Насчёт nested functions и bindTo - не уловил идеи. Можете подробнее?

если я верно понял, что делает bindTo, то оно пишется вот так:


function makeBind (obj)
  function closure ()
    print(obj.field);
  end;
  return closure;
end;

obj0 = { field=42 };
cls0 = makeBind(obj0);
cls1 = makeBind{ field=666 };
cls0(); -- prints 42
cls1(); -- prints 666


Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру