业务场景
小明要去旅游,但是还未确定以什么办法出游,有可能是徒步旅行,也有可能是自驾游。
代码演示

根据步辇儿和驾车的速率来考虑间隔旅游目的地的路程,以是这里定义了两个属性$speed和$distance。所有有了如下代码:
interface travelInterface{ public function __construct($speed, $distance); public function run();}abstract class travel implements travelInterface{ protected $speed; // 最高时速 protected $distance; // 最远路程 public function __construct($speed, $distance) { $this->speed = $speed; $this->distance = $distance; }}class drive extends travel{ public function run() { echo \公众自驾游\"大众; }}class walk extends travel{ public function run() { echo \公众徒步旅行\"大众; }}
下面是选择自驾游的代码
class human{ protected $travel; // 出行办法 public function __construct() { $this->travel = new drive(60,1000); } public function traveling(){ $this->travel->run(); }}$xiaoming = new human();$xiaoming->traveling();
那么,如果须要换一种出行办法的时候,则须要修正human类。这里看起来修正非常大略,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修正。
就说下依赖注入的根本办法
class human{ protected $travel; // 出行办法 public function __construct(travel $travel) { $this->travel = $travel; } public function traveling(){ $this->travel->run(); }}$travel = new drive(60,1000);$xiaoming = new human($travel);$xiaoming->traveling();
什么是依赖注入。
大略的说:在A类中利用了B类的实例时,B工具的布局不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的工具传入进来。这个过程便是依赖注入。
换一种通过配置文件来实现掌握反转
$config = [ \公众travel\"大众 => drive::class,];$travel = new $config[\公众travel\公众](60,1000);$xiaoming = new human($travel);$xiaoming->traveling();
通过上面的办法,以什么办法旅行,只须要修正配置$config就行。
这在我们PHP里感触不明显,以为修正$config和修正$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性上风。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只须要修正配置文件,就可以掌握类的依赖关系了。起到理解耦的浸染。(千锋PHP培训)
虽然很多时候大家一说到掌握反转,依赖注入,就非要和说到反射,我以为上面IOC只是一种思想,详细的实现办法,在不同的措辞中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化便是IOC的实现了。