IOC 例子
日期: April 14, 2021 作者:网站维护
书上看的代码例子,贴一下内容。
visit.php
<?php
interface Visit
{
public function go();
}
class Leg implements Visit
{
public function go()
{
echo "wait to Tibet!!!";
}
}
class Car implements Visit
{
public function go()
{
echo "drive car to Tibet!!!";
}
}
class Train implements Visit
{
public function go()
{
echo "go to Tibet by train!!!";
}
}
<?php
include('visit.php');
class Container
{
protected $bindings = [];
public function bind($abstract, $concrete = null, $shared = false)
{
if (! $concrete instanceof Closure){
$concrete = $this->getClosure($abstract, $concrete);
}
$this->bindings[$abstract] = compact('concrete', 'shared');
print_r($this->bindings);
}
protected function getClosure($abstract, $concrete)
{
return function($c) use ($abstract, $concrete)
{
$method = ($abstract == $concrete) ? 'build' : 'make';
return $c->$method($concrete);
};
}
public function make($abstract)
{
$concrete = $this->getConcrete($abstract);
if ($this->isBuildable($concrete, $abstract)) {
$object = $this->build($concrete);
} else {
$object = $this->make($concrete);
}
return $object;
}
protected function isBuildable($concrete, $abstract)
{
return $concrete === $abstract || $concrete instanceof Closure;
}
protected function getConcrete($abstract)
{
if (! isset($this->bindings[$abstract]))
{
return $abstract;
}
return $this->bindings[$abstract]['concrete'];
}
public function build($concrete)
{
if($concrete instanceof Closure){
return $concrete($this);
}
echo "new ";
var_dump($concrete);
$reflector = new ReflectionClass($concrete);
if (!$reflector->isInstantiable()){
echo $message = "Target [$concrete] is not instantiable.";
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return new $concrete;
}
$dependencies = $constructor->getParameters();
$instances = $this->getDependencies($dependencies);
return $reflector->newInstanceArgs($instances);
}
protected function getDependencies($parameters)
{
$dependencies = [];
foreach ($parameters as $parameter) {
$dependency = $parameter->getClass();
if(is_null($dependency)){
$dependencies = NULL;
} else {
$dependencies[] = $this->resolveClass($parameter);
}
}
return (array) $dependencies;
}
protected function resolveClass(ReflectionParameter $parameter)
{
return $this->make($parameter->getClass()->name);
}
}
class Traveller
{
protected $trafficTool;
public function __construct(Visit $trafficTool)
{
$this->trafficTool = $trafficTool;
}
public function visitTibet(){
$this->trafficTool->go();
}
}
$app = new Container();
$app->bind("Visit", "Car");
$app->bind("traveller", "Traveller");
//$car = $app->make("Visit");
$tra = $app->make("traveller");
$tra->visitTibet();
广告内容为平台自动生成