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());