一段和標準略有不同的寫法,有助於大家更好的理解Ioc容器的概念!
<?php
class A
{
protected $iocaaa;
public function __construct(Ioc $ioc)
{
$this->iocaaa = $ioc;
}
public function getB()
{
return $this->iocaaa->make('b')->abc();
}
}
class B
{
protected $c;
public function __construct(C $c)
{
$this->c = $c;
}
public function abc()
{
echo 'test';
}
}
class c{
public function __construct()
{
}
}
class Ioc
{
protected $instances = [];
public function __construct()
{
}
public function getInstance($abstract){
$reflector = new ReflectionClass($abstract);
$constructor = $reflector->getConstructor();
$dependencies = $constructor->getParameters();
if(!$dependencies){
return new $abstract();
}
foreach ($dependencies as $dependency) {
if(!is_null($dependency->getClass())){
$p[] = $this->make($dependency->getClass()->name);
}
}
return $reflector->newInstanceArgs($p);
}
public function make(string $abstract)
{
return $this->getInstance($abstract);
}
}
echo '<pre>';
$ioc = new Ioc();
$a = $ioc->make('A');
$b = $a->getB();