class Superman { protected $module; function __construct(PowerModule $PowerModule,array $arr) { $this->module = $PowerModule; echo "Superman is ready. "; $this->module->active($arr); } } interface PowerModule{ public function active(array $target); } class XPower implements PowerModule { protected $long; public function active(array $target) { $this->long = $target[0]; echo "XPower is ready.long is {$this->long}. "; } } class Boom implements PowerModule { protected $num; public function active(array $target) { $this->num = $target[0]; echo "Boom is ready.num is {$this->num}. "; } } class Fly implements PowerModule { protected $speed; protected $height; public function active(array $target) { $this->num = $target[0]; $this->speed = $target[0]; $this->height = $target[1]; echo "Fly is ready.speed is {$this->speed}.height is {$this->height}. "; } } class Ioc { protected $binds; protected $instance; public function bind($abstract,$concrete) { if ($concrete instanceof Closure) { $this->binds[$abstract] = $concrete; } else { $this->instance[$abstract] = $concrete; } } public function make($abstract,$params) { if (isset($this->instance[$abstract])) return $this->instance[$abstract]; array_unshift($params, $this); return call_user_func_array($this->binds[$abstract], $params); } } $container = new Ioc(); $container->bind('superman',function($container,$params){ return new Superman($Boom,[3]); }); $container->bind('boom',function($container){ return new Boom(); }); $container->make('superman','boom'); // $Boom = new Boom(); // $man = new Superman($Boom,[3]);//这就是依赖注入