PHP code example of gandung / dependency-injection

1. Go to this page and download the library: Download gandung/dependency-injection 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/ */

    

gandung / dependency-injection example snippets




namespace Unused;

class Foo
{
	/**
	 * @var \SplPriorityQueue
	 */
	private $heap;

	public function __construct(\SplPriorityQueue $heap)
	{
		$this->heap = $heap;
	}	
}



namespace Unused;

class Bar
{
	/**
	 * @var Foo
	 */
	private $foo;

	public function __construct(Foo $foo)
	{
		$this->foo = $foo;
	}
}



use Unused\Bar;

$container = new Container();

$bar = $container->make(Bar::class);



use Unused\Bar;
use Unused\Foo;

$container = new Container();

$container->bind(Bar::class, Foo::class);

$bar = $container->make(Bar::class);



use Unused\Bar;
use Unused\Foo;

$container = new Container();

$container->bind(Bar::class, function($container) {
	return $container->make(Foo::class);
});

$bar = $container->make(Bar::class);



use Unused\Base;
use Unused\BaseInterface;

$container = new Container();

$container->singleton(BaseInterface::class, Base::class);

$base = $container->make(BaseInterface::class);



use Unused\Base;
use Unused\BaseInterface;

$container = new Container();

$container->singleton(BaseInterface::class, function($container) {
	return $container->make(Base::class);
});

$base = $container->make(BaseInterface::class);



namespace Unused;

interface BaseInterface
{
	public function setFirstName($firstName);

	public function setMiddleName($middleName);

	public function setLastName($lastName);
}



namespace Unused;

class Base implements BaseInterface
{
	/**
	 * @var string
	 */
	private $firstName;

	/**
	 * @var string
	 */
	private $middleName;

	/**
	 * @var string
	 */
	private $lastName;

	public function setFirstName($firstName)
	{
		$this->firstName = $firstName;
	}

	public function setMiddleName($middleName)
	{
		$this->middleName = $middleName;
	}

	public function setLastName($lastName)
	{
		$this->lastName = $lastName;
	}
}



namespace Unused;

class Foo
{
	/**
	 * @var BaseInterface
	 */
	private $base;

	public function __construct(BaseInterface $base)
	{
		$this->base = $base;
	}
}



use Unused\BaseInterface;
use Unused\Base;
use Unused\Foo;

$container = new Container();

$container->bind(BaseInterface::class, Base::class);

$foo = $container->make(Foo::class);



use Unused\BaseInterface;
use Unused\Base;
use Unused\Foo;

$container = new Container();

$container->bind(BaseInterface::class, function($container) {
	return $container->make(Base::class);
});

$foo = $container->make(Foo::class);



namespace Unused;

interface BaseInterface
{
	public function setFirstName($firstName);

	public function setMiddleName($middleName);

	public function setLastName($lastName);
}



namespace Unused;

class Base implements BaseInterface
{
	/**
	 * @var string
	 */
	private $firstName;

	/**
	 * @var string
	 */
	private $middleName;

	/**
	 * @var string
	 */
	private $lastName;

	/**
	 * @implements
	 */
	public function setFirstName($firstName)
	{
		$this->firstName = $firstName;
	}

	/**
	 * @implements
	 */
	public function setMiddleName($middleName)
	{
		$this->middleName = $middleName;
	}

	/**
	 * @implements
	 */
	public function setLastName($lastName)
	{
		$this->lastName = $lastName;
	}
}



use Unused\Base;
use Unused\BaseInterface;

$container = new Container();

// with direct class name.
$container->bind(BaseInterface::class, Base::class);

// or, use a closure.
$container->bind(BaseInterface::class, function($container) {
	return $container->make(Base::class);
});

$base = $container->make(BaseInterface::class);



namespace Unused;

class FooService
{
	/**
	 * @var BaseInterface
	 */
	private $base;

	public function __construct(BaseInterface $base)
	{
		$this->base = $base;
	}
}



$container = new Container();

$container->bind(BaseInterface::class, function($container) {
	return $container->make(Base::class);
});

$container->register('foo.service', FooService::class);

$service = $container->get('foo.service');