PHPackages                             movephp/callback-container - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. movephp/callback-container

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

movephp/callback-container
==========================

Analysis and serialization of callbacks and closures

v2.0.0(8y ago)08Apache-2.0PHPPHP &gt;=7.1

Since Nov 26Pushed 8y ago1 watchersCompare

[ Source](https://github.com/movephp/callback-container)[ Packagist](https://packagist.org/packages/movephp/callback-container)[ RSS](/packages/movephp-callback-container/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (4)Dependencies (2)Versions (6)Used By (0)

[![Build Status](https://camo.githubusercontent.com/a73b7e5e82fb2369e2c59875ce2582e42537f34a94b816b25f790726a3ef3c79/68747470733a2f2f7472617669732d63692e6f72672f6d6f76657068702f63616c6c6261636b2d636f6e7461696e65722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/movephp/callback-container)[![Coverage Status](https://camo.githubusercontent.com/71bd07e2268451a537413dc1c2339be624dde591bb629774621245ef5b834a08/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d6f76657068702f63616c6c6261636b2d636f6e7461696e65722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/movephp/callback-container?branch=master)

Callback-контейнер
==================

[](#callback-контейнер)

Библиотека представляет собой небольшой класс-обёртку над встроенным в PHP типом `callable`.

Главная особенность этого контейнера - он реализует интерфейс `Serializable`. Поскольку не всякий `callable` может быть сериализован, контейнер предоставляет метод `isSerializable()` для удобной проверки возможности сериализации.

Оглавление
----------

[](#оглавление)

- [Пример использования](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
- [Допустимые callback аргументы](#%D0%94%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D0%B5-callback-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B)
- [Использование с PSR-контейнером](#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81-psr-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BE%D0%BC)
    - [Привязка PSR-контейнера после десериализации](#%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-psr-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%B4%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)
- [Анализ параметров калбека](#%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BA%D0%B0%D0%BB%D0%B1%D0%B5%D0%BA%D0%B0)
- [Несериализуемые калбеки](#%D0%9D%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D0%B5-%D0%BA%D0%B0%D0%BB%D0%B1%D0%B5%D0%BA%D0%B8)
- [Практическое применение, пример](#%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80)

Пример использования
--------------------

[](#пример-использования)

Рабочий объект контейнера создаётся через фабричный метод `make()`:

```
use \Movephp\CallbackContainer\Container;
$factory = new Container();
$callback = $factory->make('my_callback');

```

После чего его можно сериализовать:

```
if($callback->isSerializable()){
    var_dump(serialize($callback));
}

```

Или получить соответствующее замыкание:

```
call_user_func($callback->closure());

```

> Попытка сериализовать контейнер с несериализуемым калбеком вызовет исключение `\Movephp\CallbackContainer\Exception\NonSerializableException`

> **Важно:** При сериализации CallbackContainer'а с калбеком на основе объекта `[$object, 'method']` сохраняется только имя класса объекта. С одной стороны, таким образом снижаются затраты на процесс сериализации/десериализации и исключается возможные проблемы, связанные с тем, что сам переданный `$object` может быть несериализуемым. С другой стороны, важно позаботиться о том, чтобы после десериализации этот `$object` мог быть автоматически восстановлен по имени его класса (это возможно, если у него конструктор без аргументов или с использованием PSR-контейнера, см. далее).

Допустимые callback аргументы
-----------------------------

[](#допустимые-callback-аргументы)

В таблице перечислены типы значений, которые может принимать метод `make()` в качестве аргумента:

ТипКомментарийСтандартный `callable`Объект `Closure` (не может быть сериализован), строка с именем функции или массив вида `[$objectOrClassName, $methodName]`.Устаревшая форма `callable`: `[$className, $nonStaticMethodName]`Несмотря на то, что такая форма считается устаревшей, данный контейнер принимает её при условии, что объект указанного класса может быть создан без аргументов для конструктора или через PSR-контейнер.Массив вида `[$psrContainerKey, $methodName]`Допустуно при использовании данной библиотеки с PSR-контейнером (см. ниже).Использование с PSR-контейнером
-------------------------------

[](#использование-с-psr-контейнером)

Если в проекте используется DI-контейнер, реализующий интерфейс [PSR-11](http://www.php-fig.org/psr/psr-11/), в качестве аргумента в метод `make()` можно передать массив, похожий на обычный `callable`, в котором первым элемементом будет ключ, по которому можно запросить нужный объект в PSR-контейнере.

В первую очередь необходимо привязать PSR-контейнер к данной библиотеке:

```
use \Movephp\CallbackContainer\Container;
$factory = new Container($psrContiner);
$callback = $factory->make(['psr_container_key', 'method']);

```

Ключом для PSR-контейнера может быть, например, имя интерфейса, или любая строка, для которой `$psrContiner->has($key)` вернёт `TRUE`.

### Привязка PSR-контейнера после десериализации

[](#привязка-psr-контейнера-после-десериализации)

При сериализации CallbackContainer'а сохраняется только упрощённое представление исходного калбека. Соответственно, если изначально был использован PSR-контейнер, то после десериализации его нужно будет повторно привязать к CallbackContainer'у.

Это можно сделать отдельно для каждого десеризованного CallbackContainer'а:

```
$callback = unserialize($serialized);
$callback->setPsrContainer($psrContiner);

```

Или можно задать PSR-контейнер глобально для всех будущих CallbackContainer'ов, которые будут созданы напрямую (`new Container()`) или при десериализации, вызвав предвариетльно статический метод `setPsrContainerGlobal()`:

```
use \Movephp\CallbackContainer\Container;
Container::setPsrContainerGlobal($psrContiner);
$callback = unserialize($serialized);

```

Анализ параметров калбека
-------------------------

[](#анализ-параметров-калбека)

Кроме прочего CallbackContainer имеет метод `parameters()`, который возвращает массив объектов класса `Movephp\CallbackContainer\Parameter`, представляющих параметры, принимаемые заданным калбеком. Ключами этого массива являются имена параметров.

Метод `parameters()` анализирует параметры через Reflection API при первом обращении и запоминает результат при сериализации, таким образом увеличивая общую производительность, например, при извлечении массива CallbackContainer'ов из кеша.

Класс `Movephp\CallbackContainer\Parameter` имеет несколько геттеров для получения подробной информации о параметре:

МетодВозвращаемое значение`name(): string`Имя параметра`hasType(): bool``true`, если для параметра определён тип`type(): string`Строковое обозначение типа (`'int'`, `'string'` и т.д.)`isVariadic(): bool``true`, если это параметр с переменным количеством аргументов`isOptional(): bool``true`, если параметр является необязательным`getDefault(): mixed`Значение по-умолчанию для параметра, или `null`, если его нетНесериализуемые калбеки
-----------------------

[](#несериализуемые-калбеки)

Если вы хотите использовать возможность сериализации CallbackContainer'а, например, для кеширования с целью повысить производительность приложения, следует не только проверять возможность сериализации каждого элемента через `isSerializable()`, но также в целом иметь ввиду, какие виды калбеков не могут быть сериализованы. Это:

- Замыкания, т.е. объекты встроенного класса `\Closure`, которые, как правило, создаются путём объявления анонимных функций.
- Любые `callable`, связанные с анонимными классами, поскольку такие классы не имеют постоянного имени и их будет невозможно восстановить после десериализации.

Практическое применение, пример
-------------------------------

[](#практическое-применение-пример)

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

```
use Movephp\CallbackContainer\Container;

Container::setPsrContainerGlobal($psrContainer);

if ($cache->isHit()) {
    $routes = $cache->get();
} else {
    $callbackFactory = new Container();

    $rules = getRoutingRulesOverWholeProject(); // Собираем по всему проекту шаблоны роутов и связанные с ними калбеки
    $routes = [];
    foreach ($rules as $rule) {
        try {
            $callback = $callbackFactory->make($rule->callback);
        } catch (\Exception $e) {
            $logger->error($e);
            continue;
        }
        $routes[] = [
            'template' => $rule->template,
            'callback' => $callback
        ];
    }

    // Проверяем, что все калбеки сериализуемые
    $serializable = array_reduce(
        $routes,
        function ($result, $route) {
            return $result && $route['callback']->isSerializable();
        },
        true
    );
    if ($serializable) {
        // Кешируем результат
        $cache->set($routes);
        $cachePool->save($cache);
    }
}

```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

4

Last Release

3087d ago

Major Versions

v1.0.2 → v2.0.02017-11-30

### Community

Maintainers

![](https://www.gravatar.com/avatar/b086717a3f91192a67a4d5ddad6154ec01a7120cf606d7b5e385c4167e0146b7?d=identicon)[Alexey Sinkevich](/maintainers/Alexey%20Sinkevich)

---

Top Contributors

[![seka19](https://avatars.githubusercontent.com/u/2714877?v=4)](https://github.com/seka19 "seka19 (22 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/movephp-callback-container/health.svg)

```
[![Health](https://phpackages.com/badges/movephp-callback-container/health.svg)](https://phpackages.com/packages/movephp-callback-container)
```

###  Alternatives

[symfony/dependency-injection

Allows you to standardize and centralize the way objects are constructed in your application

4.2k431.1M7.5k](/packages/symfony-dependency-injection)[illuminate/contracts

The Illuminate Contracts package.

704122.9M10.1k](/packages/illuminate-contracts)[illuminate/container

The Illuminate Container package.

31278.1M2.0k](/packages/illuminate-container)[ecotone/ecotone

Supporting you in building DDD, CQRS, Event Sourcing applications with ease.

558549.8k17](/packages/ecotone-ecotone)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

728272.9k20](/packages/civicrm-civicrm-core)[internal/dload

Downloads binaries.

98142.7k10](/packages/internal-dload)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
