理解依赖注入/控制反转

 1 <?php
 2 //原始代码
 3 class MyDB{
 4     private $db;
 5     public function __construct($connInfo)
 6     {
 7     }
 8     public function queryForRows($sql){
 9         return ['user_id'=>101,"user_name"=>"shenyi"];
10     }
11 }
12  
13 class MyUser{ //MyUser 对 MyDB做正向控制
14     private $mydb;
15     public function __construct($dsn)
16     {
17         $this->mydb=new MyDB($dsn); //主动实例化DB
18     }
19     public function getAllUser(){ //业务方法
20         return $this->mydb->queryForRows("select * from users");
21     }
22 }
23  
24 //$user=new MyUser("mysql:host=localhost");
25 //var_dump($user->getAllUser());
26  
27 //我们把MyUser和数据库  两个概念 混淆在了一起,变成了一个。
28 //当数据库密码或其他信息变掉了,我们就要修改MyUser的构造函数。造成模块耦合
29 //    事实上,MyUser就应该专注于业务处理,Db就应该是独立的
30  
31  
32  
33 //IoC容器框架
34 /////////////////////////////////////////////////////////////////
35 class ClassFactory{
36     private static $container=[];
37     public static function set(string $name,callable $func){
38         self::$container[$name]=$func;
39     }
40     public static function get(string $name){
41         if(isset(self::$container[$name])){
42             return (self::$container[$name])();
43         }
44         return null;
45     }
46 }
47 ClassFactory::set('mydb',function (){
48     return new MyDB('xxxxxxxxxxx');
49 });
50 ClassFactory::set('myuser',function (){
51     return new MyUser(ClassFactory::get('mydb'));
52 });
53 /////////////////////////////////////////////////////////////////
54  
55 //业务代码
56 $myuser=ClassFactory::get('myuser');
57 var_dump($myuser->getAllUser());

 

posted @ 2019-12-07 22:11  小马奔腾960  阅读(97)  评论(0)    收藏  举报