thinkphp/vendor/opis/closure/README.md

98 lines
4.0 KiB
Markdown

Opis Closure
====================
[![Build Status](https://travis-ci.org/opis/closure.png)](https://travis-ci.org/opis/closure)
[![Latest Stable Version](https://poser.pugx.org/opis/closure/v/stable.png)](https://packagist.org/packages/opis/closure)
[![Latest Unstable Version](https://poser.pugx.org/opis/closure/v/unstable.png)](https://packagist.org/packages/opis/closure)
[![License](https://poser.pugx.org/opis/closure/license.png)](https://packagist.org/packages/opis/closure)
Serializable closures
---------------------
**Opis Closure** is a library that aims to overcome PHP's limitations regarding closure
serialization by providing a wrapper that will make all closures serializable.
**The library's key features:**
- Serialize any closure
- Serialize arbitrary objects
- Doesn't use `eval` for closure serialization or unserialization
- Works with any PHP version that has support for closures
- Supports PHP 7 syntax
- Handles all variables referenced/imported in `use()` and automatically wraps all referenced/imported closures for
proper serialization
- Handles recursive closures
- Handles magic constants like `__FILE__`, `__DIR__`, `__LINE__`, `__NAMESPACE__`, `__CLASS__`,
`__TRAIT__`, `__METHOD__` and `__FUNCTION__`.
- Automatically resolves all class names, function names and constant names used inside the closure
- Track closure's residing source by using the `#trackme` directive
- Simple and very fast parser
- Any error or exception, that might occur when executing an unserialized closure, can be caught and treated properly
- You can serialize/unserialize any closure unlimited times, even those previously unserialized
(this is possible because `eval()` is not used for unserialization)
- Handles static closures
- Supports cryptographically signed closures
- Provides a reflector that can give you information about the serialized closure
- Provides an analyzer for *SuperClosure* library
- Automatically detects when the scope and/or the bound object of a closure needs to be serialized
in order for the closure to work after deserialization
### Documentation
The full documentation for this library can be found [here][documentation].
### License
**Opis Closure** is licensed under the [MIT License (MIT)][license].
### Requirements
* PHP ^5.4 || ^7.0
## Installation
**Opis Closure** is available on [Packagist] and it can be installed from a
command line interface by using [Composer].
```bash
composer require opis/closure
```
Or you could directly reference it into your `composer.json` file as a dependency
```json
{
"require": {
"opis/closure": "^3.3"
}
}
```
### Migrating from 2.x
If your project needs to support PHP 5.3 you can continue using the `2.x` version
of **Opis Closure**. Otherwise, assuming you are not using one of the removed/refactored classes or features(see
[CHANGELOG]), migrating to version `3.x` is simply a matter of updating your `composer.json` file.
### Semantic versioning
**Opis Closure** follows [semantic versioning][SemVer] specifications.
### Arbitrary object serialization
This feature was primarily introduced in order to support serializing an object bound
to a closure and available via `$this`. The implementation is far from being perfect
and it's really hard to make it work flawless. I will try to improve this, but I can
not guarantee anything. So my advice regarding the `Opis\Closure\serialize|unserialize`
functions is to use them with caution.
### SuperClosure support
**Opis Closure** is shipped with an analyzer(`Opis\Closure\Analyzer`) which
aims to provide *Opis Closure*'s parsing precision and speed to [SuperClosure].
[documentation]: https://www.opis.io/closure "Opis Closure"
[license]: http://opensource.org/licenses/MIT "MIT License"
[Packagist]: https://packagist.org/packages/opis/closure "Packagist"
[Composer]: https://getcomposer.org "Composer"
[SuperClosure]: https://github.com/jeremeamia/super_closure "SuperClosure"
[SemVer]: http://semver.org/ "Semantic versioning"
[CHANGELOG]: https://github.com/opis/closure/blob/master/CHANGELOG.md "Changelog"