专栏首页陶士涵的菜地[PHP] 使用反射实现的控制反转

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

各个属性正确赋值:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PHP] 读取大文件并显示

    使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据

    陶士涵
  • [PHP] 项目实践中的自动加载实现

    1.使用spl_autoload_register函数注册一个自己定义的自动加载函数 2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名...

    陶士涵
  • [nodejs] nodejs开发个人博客(三)载入页面

    陶士涵
  • 基于iView的列表组件封装

    用户2193479
  • git分支管理和工作流规范:基本概念说明

    「单点登录与权限管理」系列第二部分,Demo项目的设计和开发,需要一段时间才能完成。这段时间,会把以前学习、实践、梳理过的知识分享给大家,希望大家能够喜欢。

    情情说
  • git版本控制

    mwangblog
  • 设计模式| 行为型模式 (上)

    行为型模式共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、解释器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式。 分两篇文...

    進无尽
  • jQuery的使用

    1.需求分析 在首页中(logo的上方)显示一个广告图片(页面加载后,间隔3秒弹出广告图片,再间隔3秒后隐藏广告图片)。【使用jQuery实现】

    用户5927264
  • 直接插入排序

    插入排序是一种比较简单直观的排序算法,适用处理数据量比较少或者部分有序的数据,今天我们来聊聊插入排序。

    编程三分钟
  • 如何建立有效的安全运维体系

    随着互联网行业的蓬勃发展,国内的黑客产业链早已达数十亿级别。除了各类网络攻击之外,一些黑客入侵情况也并不鲜见。这种事件相对于网络攻击有着更大的破坏力,系统被入侵...

    FB客服

扫码关注云+社区

领取腾讯云代金券