Комментарии 69
Ого, в mail.ru пресс-секретарь разбирается в замыканиях php.
Круто.
Не хватает строчки
Всех с пятницей.
Круто.
замыкания (closures).
О последних я и хочу рассказать.
…
Зачем нужны замыкания в PHP я понимаю слабо.
Не хватает строчки
Статью разместила по просьбе JohnDoe, но у него нет кармы чтобы разместить в соответствующем блоге.
Всех с пятницей.
+47
Это к тому, что мог бы запостить автор этой статьи, как делается в блоге компании Abbyy, чтобы он мог отвечать на заданные комментарии/вопросы/размышления
+1
Челябинские пресс-секретари настолько суровы, что на завтрак читают MSDN, а в перерывах на рекламу изучают замыкания и пишут статьи.
+1
возможно, девелопера _заставили_ написать эту статью. возможно, стимулировали термо-ректально. надо срочно обратиться в комитет по защите прав человека!
+1
Я все еще не могу поверить что вижу это:
а) в блоге Мэйл.ру
б) от Комисаровой
Ну да ладно, все равно молодцы, что пишете не только пресс-релизы :-)
а) в блоге Мэйл.ру
б) от Комисаровой
Ну да ладно, все равно молодцы, что пишете не только пресс-релизы :-)
+19
Непонятно, зачем делается такой упор на анонимность функций. Какая разница, анонимная функция или нет. Возможность объявлять анонимные функции — это просто синтаксический сахар.
Замыкания к анонимности функций никакого отношения не имеют. Писать, что замыкание — это комбинация 2 факторов, 1 из которых — анонимная функция — неправильно.
Замыкания к анонимности функций никакого отношения не имеют. Писать, что замыкание — это комбинация 2 факторов, 1 из которых — анонимная функция — неправильно.
+5
> Возможность объявлять анонимные функции — это просто синтаксический сахар.
вообще исторически и логически скорее на оборот, а в php… ну что тут поделаешь :D
вообще исторически и логически скорее на оборот, а в php… ну что тут поделаешь :D
0
Причём имеют в виду скорее всего просто возможность присваивания функции переменной :)
Эта возможность + сохранение родительского scope — это уже хотя бы замыкание.
Эта возможность + сохранение родительского scope — это уже хотя бы замыкание.
+1
Че ж тут удивительного? PHP весь – каша. Официальный мануал зачастую вообще содержит документацию багов отдельных версий, так как у языка нет нормальной четкой спецификации.
У меня такое ощущение что они сначала что-то кодят а потом кое-как документируют что получилось.
У меня такое ощущение что они сначала что-то кодят а потом кое-как документируют что получилось.
0
Реализация замыканий в PHP не бесспорна. Порой мне кажется что они специально выбирают самые «хитрые» пути.
0
Неверно. Возможность обьявления анонимных функций — удобна для авторов библиотек. Гарантирована непересекаемость по именам.
+2
Ух, что я вижу! Неужели в mail.ru что-то пишут на PHP? Я почему-то полагал, что у вас там все на перле и/или с++.
0
НЛО прилетело и опубликовало эту надпись здесь
Внимание, фокус:
www.php.net/manual/en/reserved.classes.php#reserved.classes.closure
Closure
The predefined final class Closure was introduced in PHP 5.3.0. It is used for internal implementation of anonymous functions.
нечеттаель документации детектед.
www.php.net/manual/en/reserved.classes.php#reserved.classes.closure
Closure
The predefined final class Closure was introduced in PHP 5.3.0. It is used for internal implementation of anonymous functions.
нечеттаель документации детектед.
+6
Вот вот и я подумал, а разве замыкания не нужны для анонимных функции это не одно и тоже?
Автор учи мат часть: Closure (computer science)!
Автор учи мат часть: Closure (computer science)!
0
В Си вообще нет замыканий, о боже, как он отстал! Абзац со сравнением lisp'а и php достаточно смешной и нелогичный.
Ну а так — да. PHP был типичным императивным языком для быстрых скриптов, и только сейчас вырывается на какой-то уровень технологий.
Ну а так — да. PHP был типичным императивным языком для быстрых скриптов, и только сейчас вырывается на какой-то уровень технологий.
+2
А, и __invoke как раз таки офигенное нововведение, лучше чем просто переменные-функции. Вопросы производительности стоит оставить оптимизаторам. А внутренние процессы в том же JS такие же.
0
вырывается? по-моему тут он просто пытается догнать.
+2
Они тоже люди я проверял :)
+1
лямбда функция это
1) анонимная функция которая может быть сохранена в переменной
2) в отличие от функции созданной create_function уничтожается при выходе из области видимости и не жрет память бесконечно.
замыкание в дополнение к этому могут иметь доступ к переменным родительской области видимости.
1) анонимная функция которая может быть сохранена в переменной
2) в отличие от функции созданной create_function уничтожается при выходе из области видимости и не жрет память бесконечно.
замыкание в дополнение к этому могут иметь доступ к переменным родительской области видимости.
+2
Правильно, зачем делать нормальную реализацию замыканий, ведь для этого придется перелопатить весь говнокод из интерпретатора PHP (слова разработчика, который был в dev team)! Намного лучше сделать идиотский magic method (*объект* используется как функция — WTF?!?!) и добавить синтаксического сахара для создания нужного объекта с таким методом.
Интересно, доступ к родительской области видимости делается при помощи банальных ссылок на нужные переменные, чтобы сборка мусора их не прибила?
А теперь смотрим как это все реализовано в том же Javascript и перестаем удивляется словам про кривую проектировку PHP.
Интересно, доступ к родительской области видимости делается при помощи банальных ссылок на нужные переменные, чтобы сборка мусора их не прибила?
А теперь смотрим как это все реализовано в том же Javascript и перестаем удивляется словам про кривую проектировку PHP.
-4
>чтобы сборка мусора их не прибила?
1) как может сборка мусора прибить РОДИТЕЛЬСКИЕ переменные?
2) какая сборка мусора в PHP? там тупо счетчик ссылок.
1) как может сборка мусора прибить РОДИТЕЛЬСКИЕ переменные?
2) какая сборка мусора в PHP? там тупо счетчик ссылок.
-2
Один только phpdaemon практически весь построен на замыканиях, так как это практически единственая метода для реализации асинхронности без гемороя.
+4
В корпоративном блоге. Неожиданно.
+7
Автор статьи, я. Готов отдуваться.
P.S. В продакшене у нас (на hitech.mail.ru) PHP действительно не используется. Зато используется JQuery. Просто PHP интересен в плане синтаксиса и реализации замыканий, да и вообще релиз 5.3 очень интересный.
P.S. В продакшене у нас (на hitech.mail.ru) PHP действительно не используется. Зато используется JQuery. Просто PHP интересен в плане синтаксиса и реализации замыканий, да и вообще релиз 5.3 очень интересный.
+9
Вообще как я писал выше замыкания нужны для создания анонимных функции, странно что вы этого не знаете. Вся статья не о замыканиях, а о анонимных функциях!
0
Я удивлен, что статья попала на главную…
Причин две:
1) Статья совершенно не про «Замыкания в PHP»… Об этом хотябы говорит ваша фраза «Зачем нужны замыкания в PHP я понимаю слабо».
2) По поводу замыканий JS — полно статей на Хабре. Я негодую — что нового в этой статье?
Аннонимные функции у меня во FW используются так:
Замыкания так:
Смысл этого в том, чтобы определять $login не внутри Validate функции.
Причин две:
1) Статья совершенно не про «Замыкания в PHP»… Об этом хотябы говорит ваша фраза «Зачем нужны замыкания в PHP я понимаю слабо».
2) По поводу замыканий JS — полно статей на Хабре. Я негодую — что нового в этой статье?
Аннонимные функции у меня во FW используются так:
getElementObject('Form')
->onValidate(function($fields){
//проверки
})
->onSubmit(function($fields){
//что делаем, если порядок
})
->onError(function($fields){
//что делаем, если всё плохо
});
* This source code was highlighted with Source Code Highlighter.
Замыкания так:
$login = Auth::getLogin();
getElementObject('Form')
->onValidate(function($fields) use ($login){
$newLogin = $fields->getElementObject('.name')->getValue();
//Проверяем, что пользователь ввел не сам себя
return $login != $newLogin;
});
* This source code was highlighted with Source Code Highlighter.
Смысл этого в том, чтобы определять $login не внутри Validate функции.
+2
Код во втором примере можно назвать практичным, но трудно назвать элегантным. Синтаксис PHP для замыканий тоже не добавляет изящества.
+1
В вашем случае, элегантность кода = создание дополнительного Validate класса в который идет загрузка $login, затем установка полю проверки?
Объясните, как по вашему поступить элегантно?
class LoginValidate extends Validate{
function setLogin($login){
$this->login = $login;
}
function onValidate($value){
return $this->login != $value;
}
}
///...
$login = Auth::getLogin();
getElementObject('Field.name')
->onValidate(
classBuilder::createClass('LoginValidate')
->setLogin($login)
);
* This source code was highlighted with Source Code Highlighter.
Объясните, как по вашему поступить элегантно?
+1
Да примерно так бы я и сделал. Вот даже в простом примере вы унаследовали свой класс от некого базового класса. Собственно возможность повторного использования кода, упрощение отладки мне и видится в преимуществах этого варианта.
+1
Я признаю, что моя реализация проверки (в первом примере) туповата. Это случилось потому что это был пример, а не реальный код.
Но вариант с классами — это засирание кодом и усложнение структуры. Очевидно, что людям разобраться и найти нужное будет намного сложнее. Создавать новый класс для каждой проверки? Создать один класс, который будет делать все проверки, который нужно искать по названию?
Делать конечно нужно всё по уму, но первый пример смотрится и помещается в голове у программиста намного лучше. Для этого и созданы замыкания.
Второй пример необходим только в случае частого использования.
Но вариант с классами — это засирание кодом и усложнение структуры. Очевидно, что людям разобраться и найти нужное будет намного сложнее. Создавать новый класс для каждой проверки? Создать один класс, который будет делать все проверки, который нужно искать по названию?
Делать конечно нужно всё по уму, но первый пример смотрится и помещается в голове у программиста намного лучше. Для этого и созданы замыкания.
Второй пример необходим только в случае частого использования.
0
p.s. А, ну и почитайте, как их можно использовать… Первая ссылка google… fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures
0
1. Зачем вы обрушили на нас этот баян? Я об писал больше года назад (18 мая 2009 года).
2. То что вы слабо представляете зачем нужны closures в PHP это говорит лишь о том что вы не в теме таких вещей как phpDaemon :-) Да и многих других интересных вещей.
2. То что вы слабо представляете зачем нужны closures в PHP это говорит лишь о том что вы не в теме таких вещей как phpDaemon :-) Да и многих других интересных вещей.
+3
P.S. Замыкания в PHP нужны потому что нам надоело видеть create_function под ободками наших унитазов.
+3
1. основное отличие от create_function или eval в возможности нормальной отладки.
2. в руби (который также ориентирован на веб-скрипты) активно используются замыкания.
2. в руби (который также ориентирован на веб-скрипты) активно используются замыкания.
0
на python надо переходить
+1
По-моему это копипаст старой статьи. Гуглил замыкания и случайно напоролся в архиве за 2009г:
abramov.tv/2009/10/chto-takoe-zamyikaniya-v-php-i-javascript/
abramov.tv/2009/10/chto-takoe-zamyikaniya-v-php-i-javascript/
+3
Тогда простите меня, это ппц — за год не разобраться, для чего они нужны…
+3
За год я убедился, что лично мне в PHP они не нужны. Очевидно же, что мое суждение субъективно. Ваше, кстати, тоже. Мы же с вами выше убедились, что все то же самое можно сделать и без замыканий. При этом я не отказываю вашему коду в практичности. И считаю здорово, что вы нашли им применение. Только не понимаю почему вы так их отстаиваете?
0
Тимур, огромное спасибо, вы первый кто мне смог полноценно и доходчиво объяснить, что такое замыкания и лямбда функции (почему они так называются) и для чего нужны :)
+1
И для чего в PHP нужны замыкания? :)
0
Спасибо! Я старался написать просто и с примерами. За это в основном и получил упреки в том, что в статье нет ничего сверхъестественного. Приятно, что вам она оказалась не бесполезной!
0
А я-то обрадовался…
0
Причем копипаст практически дословный, включая примеры и речевые обороты!
-2
Автору:
Все эти прелести действительно очень полезны. Например, используем шаблоны на чистом PHP, layout.php:
<div id=«header»><%= yield_content('header') %>
и где-нибудь
<% for_region('header', function() { %>
тра-та-та
<% }); %>
Понятно, идея взята из Rails.
Все эти прелести действительно очень полезны. Например, используем шаблоны на чистом PHP, layout.php:
<div id=«header»><%= yield_content('header') %>
и где-нибудь
<% for_region('header', function() { %>
тра-та-та
<% }); %>
Понятно, идея взята из Rails.
0
Вернемся к PHP. В нем все не так красиво как в Javascript. Во-первых, для того чтобы функция могла использовать переменные родительской функции, надо это явно указать в ее определении (это следует из идеологии языка)
Мне это наоборот представляется крайне разумным ходом, поскольку в таком случае все ненужные для замыкания локальные переменные будут удалены после завершения вызова функции, освободив память.
+3
Пример, где замыкания реально нужны:
www.pgregg.com/projects/php/preg_find/preg_find.phps
искать строку: $filesort =
Автор конечно гм… со своеобразным кодстайлом, но файлик понятный без доп знаний.
www.pgregg.com/projects/php/preg_find/preg_find.phps
искать строку: $filesort =
Автор конечно гм… со своеобразным кодстайлом, но файлик понятный без доп знаний.
0
Мне есть что вам ответить. Похоже это библиотека и стиль там процедурный. Соответственно create_function используется прежде всего, чтобы не засирать глобальное пространство имен (но, кстати, все равно это делает).
А если бы они применили ООП подход?
Во первых они бы избавились от некрасивых
define('PREG_FIND_RECURSIVE', 1);
define('PREG_FIND_DIRMATCH', 2);
…
засунув все константы в класс.
Во вторых они бы сделали сортировку, передав в uasort метод класса и из метода имея доступ ко всем свойствам, в том числе параметрам сортировки.
Разве это не сделало бы код прозрачнее и юзабельнее?
А если бы они применили ООП подход?
Во первых они бы избавились от некрасивых
define('PREG_FIND_RECURSIVE', 1);
define('PREG_FIND_DIRMATCH', 2);
…
засунув все константы в класс.
Во вторых они бы сделали сортировку, передав в uasort метод класса и из метода имея доступ ко всем свойствам, в том числе параметрам сортировки.
Разве это не сделало бы код прозрачнее и юзабельнее?
-2
позитивно
0
Осталось дождаться пока
array_map()
и подобные функцию научатся работать в несколько потоков. 0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Замыкания в php