rs/dice

此包已被弃用且不再维护。未建议替代包。

一个轻量级的PHP依赖注入容器(DIC)。请注意:此分支仅兼容PHP5.6。PHP5.5、5.4和5.3的兼容版本可在GitHub上的单独分支找到。

2.04 2017-01-25 11:18 UTC

This package is not auto-updated.

Last update: 2024-09-26 19:16:55 UTC


README

Dice是一个专注于轻量级、快速,尽可能少配置的PHP依赖注入容器。

项目目标

  1. 轻量级,不只是一个包含数十个文件的庞大库(Dice是一个100行代码的单个类),但支持比复杂容器更多的所有功能

  2. “只需工作”。基本功能应该可以在零配置下工作

  3. 当需要配置时,它应该尽可能最小、可重用,并且易于使用。

  4. 速度!(见性能部分

安装

只需将轻量级的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

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