[PHP] 使用反射实现的控制反转

搬家进程中反射实现控制反转,样做的好处是可以通过配置项动态的控制下面那个类的属性


1.$this->getObject($class, $config->getConfig('param'), array($this), $interfaces);
2.$reflection=new ReflectionClass($class);
3.$reflection->implementsInterface($interface)//检测是否实现接口
4.$obj=$reflection->newInstanceArgs()
5.$reflection->hasMethod($method)//检测是否有这个方法
6.$obj->$method($v);

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
这样做的好处是可以通过配置项动态的控制下面那个类的属性
*/
 
//配置项
$conf=array(
        'class'=>'User',
        'newParams'=>array('name'=>'taoshihan'),
        'setParams'=>array(
                'score'=>'100fen',
                'age'=>'100'
        )  
);
//业务类
class User {
    private $name;
    private $age;
    private $score;
    public function __construct($name){
        $this->name=$name;
    }  
    public function setAge($age){
        $this->age=$age;
    }  
    public function setScore($score){
        $this->score=$score;
    }  
}
//生成对象
class Application{
        private $conf;
        public function __construct($conf){
                $this->conf=$conf;
        }  
        public function getAction(){
                $obj=$this->getObject($this->conf['class'],$this->conf['setParams'],$this->conf['newParams']);
                return $obj;
        }  
        public function getObject($class, $setParams = null, $newParams = array()){
                if (!$class) {
                        return null;
                }           
                $reflection = new ReflectionClass($class);
                $obj = $reflection->newInstanceArgs($newParams);   
                if (!empty($setParams)) {
                        foreach ($setParams as $k => $v) {   
                        $method = 'set' . ucfirst($k);
                        if ($reflection->hasMethod($method)) {   
                                $obj->$method($v);   
                        }} 
                }  
                return $obj;
        }
}
 
$app=new Application($conf);
$obj=$app->getAction();
var_dump($obj);

各个属性正确赋值:

 

  

 

posted @   唯一客服系统开发笔记  阅读(635)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-04-26 [日常] Go语言圣经--示例: 并发的Clock服务习题
2018-04-26 [日常] Go语言圣经--接口约定习题2
2016-04-26 [javascript] 看知乎学习js闭包
2016-04-26 [PHP] 看博客学习插入排序
2016-04-26 [android] ndk环境的搭建
点击右上角即可分享
微信分享提示
1
chat with us