zoukankan      html  css  js  c++  java
  • [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);

    举例:

    /*
    这样做的好处是可以通过配置项动态的控制下面那个类的属性
    */
    
    //配置项
    $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);
    

    各个属性正确赋值:

      

  • 相关阅读:
    蜕变过程中的思考
    Django template for 循环用法
    Django 发送html邮件
    Django F对象的使用
    在Django中使用Q()对象
    ubuntu中管理用户和用户组
    Django settings.py 的media路径设置
    Git版本控制 备忘录
    Git .gitignore文件的使用
    将git关联到pycharm
  • 原文地址:https://www.cnblogs.com/taoshihan/p/10773463.html
Copyright © 2011-2022 走看看