rs / dice
一个轻量级的PHP依赖注入容器(DIC)。请注意:此分支仅兼容PHP5.6。PHP5.5、5.4和5.3的兼容版本可在GitHub上的单独分支找到。
Requires
- php: >=5.6.0
This package is not auto-updated.
Last update: 2024-09-26 19:16:55 UTC
README
Dice是一个专注于轻量级、快速,尽可能少配置的PHP依赖注入容器。
项目目标
-
轻量级,不只是一个包含数十个文件的庞大库(Dice是一个100行代码的单个类),但支持比复杂容器更多的所有功能
-
“只需工作”。基本功能应该可以在零配置下工作
-
当需要配置时,它应该尽可能最小、可重用,并且易于使用。
-
速度!(见性能部分)
安装
只需将轻量级的Dice.php
包含到您的项目中,就可以使用而不需要任何进一步的配置
简单示例
<?php class A { public $b; public function __construct(B $b) { $this->b = $b; } } class B { } require_once 'Dice.php'; $dice = new \Dice\Dice; $a = $dice->create('A'); var_dump($a->b); //B object ?>
完整文档
有关完整文档,请参阅Dice PHP依赖注入容器主页
PHP版本兼容性
Dice与PHP5.4及更高版本兼容,有Dice的存档版本支持PHP5.3,但不再维护。
性能
Dice使用反射,这通常被错误地标记为“慢”。反射比加载和解析配置文件快得多。这里有一组基准测试和这里(要自己下载基准测试工具,请参阅此存储库)和Dice在大多数情况下都更快。
在实际世界测试(测试6)中,Dice与Pimple(需要编写大量配置代码)并驾齐驱,尽管Symfony\DependencyInjection在创建对象方面更快,但它有更大的开销,并且您需要在每个页面加载时创建超过500个对象,直到它比Dice快。Phalcon也是如此,加载Phalcon扩展的开销意味着除非您在每个HTTP请求中创建超过一千个对象,否则这种开销是不值得的。
致谢
最初由Tom Butler (@TomBZombie) 开发,感谢daniel-meister (@daniel-meister)、Garrett W. (@garrettw)、maxwilms (@maxwilms) 对错误修正、建议和改进所做的贡献。
更新
29/10/2014
- 基于问题#15,Dice现在将仅在它们被\Dice\Instance包裹时调用闭包。**请注意:这是向后不兼容的**。
以前Dice运行了作为替换、constructParams传递以及调用方法时传入的闭包
$rule->substitutions['A'] = function() { return new A; }; $rule->call[] = ['someMethod', function() { // '2' will be provided as the first argument when someMethod is called return 2; }]; $rule->constructParams[] = function() { //'abc' will be providedas the first constructor parameter return 'abc'; };
由于闭包始终被调用并执行,这种行为已经改变,这使得无法提供闭包作为构造参数或调用方法,因为闭包总是被调用和执行。
为了克服这一点,Dice现在只有在闭包被\Dice\Instance包裹时才会调用闭包
$rule->substitutions['A'] = new \Dice\Instance(function() { return new A; }); $rule->call[] = ['someMethod', new \Dice\Instance(function() { // '2' will be provided as the first argument when someMethod is called return 2; }]); $rule->constructParams[] = new \Dice\Instance(function() { //'abc' will be providedas the first constructor parameter return 'abc'; });
04/09/2014
- 已将PHP5.6分支推送到线上。这使用PHP5.6功能稍微高效一些。对于PHP5.4-PHP5.5,请参阅相关分支。此版本将在PHP5.6更广泛之前得到维护。
26/08/2014
- 添加了PHP5.6分支。通过使用PHP5.6特性对代码进行了整理。PHP5.6发布后将移动到master分支。
28/06/2014
- 大幅提高了效率。Dice现在成为PHP中最快的依赖注入容器!
06/06/2014
- 添加了对循环引用的支持(https://github.com/TomBZombie/Dice/issues/7)。请注意,这是一个糟糕的设计,但这个修复将阻止该设计造成的无限循环。
27/03/2014
- 移除了assign()方法,因为这个功能可以通过使用$rule->shared重复实现。
- 移除了$dice->create()中的$callback参数,因为这个功能的唯一实际用途可以通过使用$rule->shareInstances更好地实现。
- 整理了代码,移除了未使用/未记录的功能。Dice现在更加轻量级且更快。
- 修复了一个bug,当使用$rule->call时,它会在每个方法调用时使用构造函数上的替换规则。
- 更新了Dice文档,以使用简写数组语法。
01/03/2014
- 添加了Xml Loader和Loader Callback类的测试用例。
- 添加了JSON loader + 测试用例。
- 将所有测试用例添加到测试套件中。
- 迁移到PHP5.4数组语法。PHP5.3兼容版本现在可在PHP5.3分支中找到。
- 修复了一个问题,使用命名实例时,每次创建类都会触发自动加载器使用无效的类名。
28/02/2014
- 添加了基本命名空间支持。文档更新将随后进行。还将XML加载器移入自己的文件,如果您使用它,需要单独包含。
- 请注意:更改不具有向后兼容性。但是,通过以下查找/替换操作可以轻松修复。
new Dice => new \Dice\Dice new DiceInstance => new \Dice\Instance new DiceRule => new \Dice\Rule