exts / canister
此包的最新版本(1.0.0-beta8)没有可用的许可信息。
PHP 7 依赖自动绑定 psr-11 容器
1.0.0-beta8
2017-05-23 22:02 UTC
Requires
- php: ^7.1
- psr/container: ^1.0
- psr/simple-cache: ^1.0
Requires (Dev)
- phpunit/phpunit: ^6.1.0
This package is auto-updated.
Last update: 2024-09-21 20:41:14 UTC
README
Canister 是 PHP 7 的 psr-11 自动绑定容器。稍后会添加示例。
注释
- 如果存在,容器之外的任何类都将自动解析
- 默认情况下,所有解析的类都是共享的
- 默认情况下,反射器使用简单的数组缓存,但可以通过使用传递给新反射器实例构造函数的 PSR-16 简单缓存接口来覆盖它
- 容器是
ArrayAccess
的实现,因此您可以执行几乎与使用ArrayAccess
一样多的操作 - 当代码尝试从容器中解析类实例时,您可以定义/覆盖类实例的默认值。
- 当从容器中调用
get
方法时,get 方法按以下顺序检查:容器、工厂调用、共享调用,然后尝试解析任何存在的类,并首先从反射器的缓存中获取它们,然后自动解析。如果所有这些都失败了,它将返回NULL
示例
以下是它用法的简单示例。
基本实例化
use Canister; $container = new Canister;
将基本数据存储到容器中
$container['my-key-value'] = 'accessed anywhere'; echo $container->get('my-key-value'); // or $container['my-key-value'];
自动解析一个类
class Example { public function foo() { return 'bar'; } } $example = $container->get(Example::class); echo $example->foo(); // -> 'bar'
为类创建别名
$container->alias(ExampleInterface::class, Example::class); $example = $container->get(ExampleInterface::class); echo $example->foo(); // -> 'bar'
这也可以自动将依赖项传递给类
class Test implements TestInterface { public function example() { return 'example'; } } class TestExample { public function __construct(TestInterface $test) { $this->test = $test; } public function testing() { return $this->test->example(); } } $container->alias(TestInterface::class, Test::class); $test_example = $container->get(TestExample::class); echo $test_example->testing(); // -> 'example'
将类定义为工厂
每次调用 FactoryClass
时,它都将是一个新的实例,而不是默认共享。
$container->factory(FactoryClass::class);
定义工厂调用
默认情况下,调用也会自动解析依赖项,因此您可以直接访问容器,因为它默认传递给容器。
$container->factory(FactoryClass::class, function() { //... });
定义共享调用
想要执行相同的事情而不是每次调用时创建新实例?那么将 factory
替换为 shared
并获得相同的功能。
(注意:由于自动解析是共享的,您不能像使用 factory
方法一样单独传递一个类名)
为调用和类定义默认参数
对于调用,它非常简单
$container->share('example', function($foo, $bar) { return $foo + $bar; }); $container->define('example', [ 'foo' => val(5), 'bar' => val(21) ]); echo $container->get('example');
第一个参数是我们试图定义参数的类名或调用名。第二个参数是一个数组,用于匹配我们想要定义的参数。
您不需要按任何顺序排列它们,只需知道变量名,将其作为键即可。
全局定义函数
在 Canister
命名空间中,有两个全局定义函数叫做 val
(或 Canister\val()
)和 bag
(或 Canister\bag()
)。
val
函数用于告诉解析方法我们正在使用原始值。
bag
函数用于告诉解析方法我们应该检查容器中的此值。
其他注意事项
- 您可以解析 PHP 类,并定义它们的值。
$container = new Canister; $container->define(\PDO::class, [ 'dsn' => val('sqlite::memory:'), ]); $pdo = $container->get(\PDO::class); echo is_a($pdo, \PDO::class) ? 'true' : 'false'; // -> true