codeburner / container
史上最快的IoC容器。
Requires
- php: >=7.0.0
- psr/container: 1.0.x-dev
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-14 16:50:21 UTC
README
为您的构建提供最快IoC容器包,以构建快速的Web应用程序。
感谢Tom Butler,他的dice公告激励了我,这是一个快速的依赖注入容器。
##安装
将codeburner/container
添加到您的composer.json
文件中,并更新或安装composer依赖项。
{ "require": { "codeburner/container": "^2.0" } }
或通过CLI
$ composer require codeburner/container --save
##使用方法
简介
欢迎来到Codeburner快速容器文档!在开始使用之前,建议您了解本包所有部分的 主要目标和使命。
性能
Codeburner项目创建以性能为重点的包,基准测试即将到来!
概念
容器负责自动实例化新对象,解析所有类依赖项,并存储这些对象。这使您可以移除硬编码的类依赖项,并在运行时动态注入依赖项,从而提高了灵活性。
使用方法
在您准备好要实例化的类后,您只需要注册绑定并调用即可。
use Codeburner\Container\Container; $container = new Container; // Regiser a "stdClass" class to a "std" key. $container->set('std', 'stdClass'); // Accessing new "stdClass" objects. $container->get('std');
示例
使用示例即将推出。
绑定
绑定是存储在容器中的对象。容器实现了PSR-11,提供get($id)
和has($id)
方法来访问绑定,并定义set($id, $concrete)
来存储对象。
class ClassA { public function __construct(stdClass $dependency) { } } $container->set('my-a', 'ClassA'); if ($container->has('my-a')) { $container->get('my-a'); }
绑定类型
可解析绑定
可解析绑定将在每次访问时返回一个新的实例。
$container->set('app.model.posts', App\Model\Post::class); $obj1 = $container->get('app.model.posts'); // App\Model\Post#1 $obj2 = $container->get('app.model.posts'); // App\Model\Post#2
已解析绑定
已解析绑定不再只是单例,每次访问都会返回相同的实例。
// you can define by passing a third parameter to set $container->set('database', App\Database::class, true); // or using the `singleton` method $container->singleton('database', App\Database::class); $obj1 = $container->get('database'); // App\Database#1 $obj2 = $container->get('database'); // App\Database#1
绑定方式
字符串
定义绑定的最简单方式是仅提供一个类名作为字符串。
class ClassNameTest { } $container->set('someobj', ClassNameTest::class);
闭包
有时您需要在对象上设置一些属性或执行一些初始化逻辑,您可以使用闭包绑定来完成。
$container->set('someobj', function ($container) { $obj = new stdClass; $obj->attribute = 1; return $obj; });
实例
如果您需要附加一个现有的实例,应使用set
或instance
方法。
$obj = new stdClass; // you can set instances directly by the set method $container->set('std', $obj); // or use the `instance` method $container->instance('std', $obj);
解析绑定
容器的伟大目标是自动注入所有类依赖项,如果您只需要创建一个类的实例而不将其绑定到容器中,则使用make
方法。
class Post { public function __construct(Category $category) { $this->category = $category; } } class Category { public function __construct() { $this->id = rand(); } } $post = $container->make(Post::class); echo $post->category->id;
手动设置依赖项
有时您希望在实例化时,某些类将接收另一个类的特定对象。
class Post { public function __construct(Category $category) { $this->category = $category; } } class Category { public function __construct() { $this->id = rand(); } } $category = new Category; $category->id = 1; $container->setTo(Post::class, Category::class, $category); $post = $container->make(Post::class); echo $post->category->id; // 1
make($abstract, $parameters = [], $force = false)
接受第二个参数来定义已解析的依赖项,并接受第三个参数以确保创建新的对象。
$post = $container->make(Post::class, [Category::class => new Category], true);
执行闭包
如果您有一个具有依赖项的闭包,可以使用call($closure, $parameters = [])
方法来解析它。
$container->call(function (User $user, Posts $posts) { // ... });
与make
一样,您可以传递一个已解析依赖项的数组。
$container->call(function (User $user, Posts $posts) {}, [User::class => new User]);
扩展绑定
有时您需要修改绑定,要执行此操作,请使用extend
方法。它们接收旧绑定对象和容器引用。
$container->set('app.services.mail', App\Services\MailService::class); $container->extend('app.services.mail', function ($instance, $container) { $instance->environment('development'); $instance->setHtmlWrapper($container->get('app.wrappers.html')); return $instance; });
异常
Codeburner 容器实现了 PSR-11 标准,提供了两种异常类型,分别是 Psr\Container\Exception\NotFoundException
和 Psr\Container\Exception\ContainerException
。
API
- Container
call(closure $closure, array $parameters = []) : mixed
执行一个闭包,解析其依赖项make(string $abstract, array $parameters = [], bool $force = false) : mixed
在容器中解析某个对象flush() : Container
刷新容器get(string $abstract) : mixed
获取容器中存储的内容has(string $abstract) : bool
验证容器中是否存在某个内容set(string $abstract, $concrete, bool $shared = false) : Container
在容器中存储某个内容setIf(string $abstract, $concrete, bool $shared = false) : Container
如果容器中不存在该内容,则存储它setTo(string $abstract, string $dependencyName, $dependency) : Container
定义容器中某个已解析的依赖项singleton(string $abstract, $concrete) : Container
存储一个新的单例对象instance(string $abstract, $concrete) : Container
存储一个新的实例化类isSingleton(string $abstract) : bool
验证容器中的内容是否为单例isInstance(string $abstract) : bool
验证容器中的内容是否为实例extend(string $abstract, closure $extender) : Container
包装某个实例的创建过程share(string $abstract) : Container
将某个内容转换为单例