1. Go to this page and download the library: Download xtompie/container library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use Xtompie\Container\Container;
class Foo
{
// Foo class logic
}
$container = new Container();
$foo = $container->get(Foo::class);
var_dump($foo instanceof Foo); // true
use Xtompie\Container\Container;
class Bar
{
public function __construct(
public Foo $foo,
public ?string $qux = null
) {
}
}
$container = new Container();
$values = ['qux' => 'quxx'];
$bar = $container->resolve(Bar::class, $values);
var_dump($bar instanceof Bar); // true
var_dump($bar->qux); // 'quxx'
use Xtompie\Container\Container;
class Bar
{
public function __construct(
public Foo $foo,
public ?string $qux = null
) {
}
}
$container = new Container();
$bar = $container->get(Bar::class);
var_dump($bar instanceof Bar); // true
var_dump($bar->foo instanceof Foo); // true
var_dump($bar->qux); // null
use Xtompie\Container\Container;
interface FooInterface {}
class Foo implements FooInterface {}
$container = new Container();
$container->bind(FooInterface::class, Foo::class);
$fooInterface = $container->get(FooInterface::class);
var_dump($fooInterface instanceof Foo); // true
use Xtompie\Container\Container;
class Foo2 {}
$container = new Container();
$container->bind(Foo::class, Foo2::class);
$foo = $container->get(Foo::class);
var_dump($foo instanceof Foo2); // true
use Xtompie\Container\Container;
$container = new Container();
$instance1 = $container->get(Foo::class);
$instance2 = $container->get(Foo::class);
var_dump($instance1 === $instance2); // true
use Xtompie\Container\Container;
$container = new Container();
$container->transient(Foo::class);
$instance1 = $container->get(Foo::class);
$instance2 = $container->get(Foo::class);
var_dump($instance1 === $instance2); // false
use Xtompie\Container\Container;
use Xtompie\Container\Transient;
class Foo implements Transient {}
$container = new Container();
$instance1 = $container->get(Foo::class);
$instance2 = $container->get(Foo::class);
var_dump($instance1 === $instance2); // false
namespace Xtompie\Container;
interface Provider
{
public static function provide(string $abstract, Container $container): mixed;
}
use Xtompie\Container\Container;
use Xtompie\Container\Provider;
class Baz {}
class BazProvider implements Provider
{
public static function provide(string $abstract, Container $container): mixed
{
return new Baz();
}
}
use Xtompie\Container\Container;
$container = new Container();
$container->provider('Quux', BazProvider::class);
$quux = $container->get('Quux');
var_dump($quux instanceof Baz); // true
use Xtompie\Container\Container;
use Xtompie\Container\Provider;
class Qux implements Provider
{
public static function provide(string $abstract, Container $container): object
{
return new Qux(val: 42);
}
public function __construct(
public int $val,
) {
}
}
$container = new Container();
$qux = $container->get(Qux::class);
var_dump($qux instanceof Qux); // true
var_dump($qux->val); // 42
use Xtompie\Container\Container;
$container = new Container();
$container->bind(FooInterface::class, Foo::class);
$container->bind(Foo::class, Foo2::class);
$fooInterface = $container->get(FooInterface::class);
var_dump($fooInterface instanceof Foo2); // true
use Xtompie\Container\Container;
class Foo
{
public function method(): string
{
return 'Foo';
}
}
$container = new Container();
$result = $container->call(function(Foo $foo) {
return $foo->method(); // 'Foo'
});
echo $result; // Foo
use Xtompie\Container\Container;
class Foo
{
public function method(): string
{
return 'Foo';
}
}
class Call
{
public static function f1(Foo $foo): string
{
return $foo->method();
}
}
$container = new Container();
$result = $container->call([Call::class, 'f1']);
echo $result; // Foo
use Xtompie\Container\Container;
class Foo
{
public function method(): string
{
return 'Foo';
}
}
class Call
{
public function f2(Foo $foo): string
{
return $foo->method();
}
}
$container = new Container();
$call = new Call();
$result = $container->call([$call, 'f2']);
echo $result; // Foo
use Xtompie\Container\Container;
class Foo
{
public function method(): string
{
return 'Foo';
}
}
class Bar
{
public function execute(Foo $foo, string $name): string
{
return $foo->method() . ' ' . $name;
}
}
$container = new Container();
$customValues = [
'name' => 'CustomName',
];
$bar = new Bar();
$result = $container->call([$bar, 'execute'], $customValues);
echo $result; // Foo CustomName
use Xtompie\Container\Container;
class Foo
{
public function method(): string
{
return 'Foo';
}
}
$container = new Container();
$args = $container->callArgs(function(Foo $foo) {
return $foo->method();
});
var_dump($args); // Array with resolved arguments, e.g., [Foo instance]
$customValues = ['foo' => new Foo2()];
$args = $container->callArgs(function(Foo $foo) {
return $foo->method();
}, $customValues);
var_dump($args); // Custom values take precedence over container resolution