Приветствую,
Этот небольшой урок создан, чтобы осветить тему замыканий в PHP. Прежде всего, стоит пояснить, что такое замыкание. Одно из определений замыкания:
Замыкание - это анонимная функция, то есть функция, не имеющая имени.
В какой-то мере это отражает суть замыкания. Важно понимать, что замыкание есть некая самостоятельная сущность с теоретической точки зрения и не путать само понятие замыкания с тем, как оно конкретно реализовано. Ниже я опишу в чем разница.
О применимости
Для того, чтобы лучше понимать область применимости замыканий, следует вспомнить (или узнать, если вы еще этого не сделали), что в PHP существует так называемый псевдотип данных - callback. По сути, переменные такого типа являются правильными с точки зрения интерпретатора сущностями для вызова. Иными словами, данные такого типа могут быть использованы как функции. Строго говоря, этот тип шире, чем просто замыкания, в него могут входить также и строковые названия функций. Приведу полный список:
0. Собственно, замыкания
1. Строки, являющиеся именами пользовательских либо стандартных функций (например, "trim")
2. Имена методов, в том числе статичных
При этом стоит помнить, что в последнем случае фактически callback-данные будут представлять собой массив с указанием объекта в элементе с нулевым индексом и имя метода - в элементе с первым индексом. Например:
1. EuGen - 11 Марта, 2012 - 15:35:18 - перейти к сообщению
- выше я первый раз указываю синтаксис замыканий, что, вероятно, преждевременно, но если вам не понятно - пока пропустите и вернитесь к примеру позднее. Данные callback-типа могут использоваться в функциях, например, array_walk или call_user_func.
Немного формальности
Теперь пора рассказать собственно о том, как строятся замыкания. В зависимости от версии PHP они могут:
0. Не поддерживаться вовсе, версия PHP < 4.0.1
1. Поддерживаться только через create_function, версия PHP 4 >=4.0.1 или PHP 5 < 5.3
2. Поддерживаться и через create_function и через специальный синтаксис.
Вариант, когда замыкания не поддерживаются вовсе, нас не интересует, и потому я расскажу о двух способах создания замыканий (тех, что в пунктах 1. и 2.).
Итак, создание замыканий при помощи create_function:
Разумеется, наиболее полное описание этой функции есть на официальном сайте, но я сделаю некоторое резюме.
Функция принимает два параметра и оба - строковые. Строка-список аргументов, разделенных запятой, указывается первым параметром, PHP-код указывается вторым параметром.
Приведу пример:
- по сути, создает функцию, принимающую два параметра и возвращающую их сумму. А как же выглядит собственно $fnCallback? Здесь все просто - create_function вернет строку для созданного замыкания. По сути, это будет некоторым уникальным идентификатором замыкания в глобальном пространстве имен. Модифицируем предыдущий пример и увидим: