Dice is a minimalist Dependency Injection Container for PHP with a focus on being lightweight and fast as well as requiring as little configuration as possible., (*1)
Project Goals
1) To be lightweight and not a huge library with dozens of files (Dice is a single 100 line class) yet support all features (and more) offered by much more complex containers, (*2)
2) To "just work". Basic functionality should work with zero configuration, (*3)
3) Where configuration is required, it should be as minimal and reusable as possible as well as easy to use., (*4)
4) Speed!, (*5)
Installation
Just include the lightweight Dice.php
in your project and it's usable without any further configuration:, (*6)
Simple example:, (*7)
b = $b;
}
}
class B {
}
require_once 'Dice.php';
$dice = new \Dice\Dice;
$a = $dice->create('A');
var_dump($a->b); //B object
?>
Full Documentation
For complete documentation please see the Dice PHP Dependency Injection container home page, (*8)
PHP version compatibility
Dice is compatible with PHP5.4 and up, there are archived versions of Dice which supports PHP5.3 however this is no longer maintanied., (*9)
Credits
Originally developed by Tom Butler (@TomBZombie), with many thanks to daniel-meister (@daniel-meister), Garrett W. (@garrettw), maxwilms (@maxwilms) for bug fixes, suggestions and improvements., (*10)
Updates
29/10/2014
* Based on Issue #15, Dice will now only call closures if they are wrapped in \Dice\Instance. **PLEASE NOTE: THIS IS BACKWARDS INCOMPATIBLE **., (*11)
Previously Dice ran closures that were passed as substitutions, constructParams and when calling methods:, (*12)
$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';
};
This behaviour has changed as it makes it impossible to provide a closure as a construct parameter or when calling a method because the closure was always called and executed., (*13)
To overcome this, Dice will now only call a closures if they're wrapped in \Dice\Instance:, (*14)
$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
* Pushed PHP5.6 branch live. This is slightly more efficient using PHP5.6 features. For PHP5.4-PHP5.5 please see the relevant branch. This version will be maintained until PHP5.6 is more widespread., (*15)
26/08/2014
* Added PHP5.6 branch. Tidied up code by using PHP5.6 features. This will be moved to master when PHP5.6 is released, (*16)
28/06/2014
* Greatly improved efficienty. Dice is now the fastest Dependency Injection Container for PHP!, (*17)
06/06/2014
* Added support for cyclic references ( https://github.com/TomBZombie/Dice/issues/7 ). Please note this is poor design but this fix will stop the infinite loop this design creates., (*18)
27/03/2014
* Removed assign() method as this duplicated functionality available using $rule->shared
* Removed $callback argument in $dice->create() as the only real use for this feature can be better achieved using $rule->shareInstances
* Tidied up code, removing unused/undocumented features. Dice is now even more lightweight and faster.
* Fixed a bug where when using $rule->call it would use the substitution rules from the constructor on each method called
* Updated Dice documentation to use shorthand array syntax, (*19)
01/03/2014
* Added test cases for the Xml Loader and Loader Callback classes
* Added a JSON loader + test case
* Added all test cases to a test suite
* Moved to PHP5.4 array syntax. A PHP5.3 compatible version is now available in the PHP5.3 branch.
* Fixed an issue where using named instances would trigger the autoloader with an invalid class name every time a class was created, (*20)
28/02/2014
* Added basic namespace support. Documentation update will follow shortly. Also moved the XML loader into its own file, you'll need to include it separately if you're using it.
* Please note: CHANGES ARE NOT BACKWARDS COMPATIBLE. However they are easily fixed by doing the following find/replaces:, (*21)
new Dice => new \Dice\Dice
new DiceInstance => new \Dice\Instance
new DiceRule => new \Dice\Rule