搜索

首页  >  问答  >  正文

怎么能通俗易通的了解php中的反射和依赖注入这两个概念

求大神指点,谢谢

大家讲道理大家讲道理2774 天前591

全部回复(11)我来回复

  • 高洛峰

    高洛峰2017-04-11 09:11:01

    没必要了解,真的,不逗你。
    除非你去开发类似ZendFramework, ThinkPHP, CakePHP之类的框架,几乎没有机会用到这个。
    这是很底层的东西,尤其是依赖注入这种东西的应用场景就是辅助开发,选型的框架支持依赖注入就行了,没必要自己实现。而反射这个东西也差不多,在业务逻辑中我从来没遇到过必须要靠反射解决的问题,同样也是框架才用到。

    哦,看错了,你只要知道概念,通俗的说法就是
    反射是通过对象实例反向分析,从而获取其信息,例如基于反射自动根据对象实例生成其对应的类的PHPDocument文件
    依赖注入是指自动分析构造对象、调用方法时需要的参数,并自动注入该参数。通常此类对象的实例需要通过特定方法获得,而很难通过简单的new进行构造。

    回复
    0
  • 阿神

    阿神2017-04-11 09:11:01

    所谓反射是动态获取类信息,还能做出修改。比如一些魔术方法 __FUNCTION__,__METHOD__。进阶一点可以使用 reflectionClass,就是反射类获取。
    依赖注入,也叫控制反转。有时间再上代码演示

    回复
    0
  • 黄舟

    黄舟2017-04-11 09:11:01

    说不清楚,主要是类的一些魔法方法
    你可以百度下 php序列化漏洞

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-11 09:11:01

    1 首先解释下我熟悉的"依赖注入"吧,依赖注入是指将依赖的对象通过参数的形式一次性传入,而不是在使用时显示new。举个粟子:

    //这就是依赖注入。。。
    class Bar
    {
    }
    
    class Foo
    {
        protected $bar;
    
        public function __construct(Bar $bar)
        {
            $this->bar = $bar;
        }
    
        public function getBar()
        {
            return $this->bar;
        }
    }
    
    $bar = new Bar();
    $foo = new Foo($bar); //将类Bar的对象$bar通过参数的形式注入进去
    

    2 扩展:
    //依赖类Human
    abstract class Human
    {
    }

    //继承依赖类Human的Woman
    class Woman extends Human
    {
    }

    class Man extends Human
    {

    protected $wife;
    
    public function setWife(Human $human)
    {
       $this->wife = $human;
    }

    }

    $man = new Man();
    $man->setWife(new Woman());

    总结:在依赖注入之前声明的类时,这个类可以是继承依赖类的任何类(接口同理)

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-11 09:11:01

    反射就是反向映射,用于获取类(不仅仅只是类)的信息,比如你想知道一个类包含哪些方法、这些方法需要传入什么参数,每个参数是什么类型。

    依赖注入就需要利用反射实现,比如:

    class A
    {
        protected $b;
    
        public function __constrcut(B $b)
        {
            $this->b = $b;
        }
    }
    
    // 通过控制反转容器生成 A 的实例时,会通过反射发现 A 的构造函数需要一个 B 类的实例
    // 于是自动向 A 类的构造函数注入 B 类的实例
    $a = IoC::make(A::class);

    反射还有很多用处,比如单元测试中做出一系列的断言,对于一些私有属性的获取判断,还有 PHPDocument 文档生成(因为反射可以获取方法和类的注释)

    控制反转和依赖注入很显然必须要用到此功能。

    关于依赖注入可以参考我的博客这篇文章,虽然是针对 Laravel 框架写的,但是也具有普遍性(Laravel 用的设计模式非常丰富而且都没滥用,恰到好处,十分适合学习):

    https://www.insp.top/article/learn-laravel-container

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-11 09:11:01

    依赖注入就是动态加载类对象并实例化。一般用于读取配置文件按需加载。

    反射除了能做到这个,还能做到动态访问对象的成员。php这种脚本语言的反射更为强大,还能通过修改对象内部的关联表来为对象添加新的成员。

    回复
    0
  • 黄舟

    黄舟2017-04-11 09:11:01

    ie8用e.cancelBubble=true
    别的用e.stopPropagation()

    回复
    0
  • PHP中文网

    PHP中文网2017-04-11 09:11:01

    依赖注入,我的理解是对象加载到类的构造方法中,为了解耦,一般会选择通过接口的方式,在配置好按需加载到主类中进行拼装,实现多种功能
    反射就是取出类中的属性和方法

    回复
    0
  • PHP中文网

    PHP中文网2017-04-11 09:11:01

    给你推荐个地址吧,http://www.digpage.com/di.html,内容将的是yii2的依赖注入,里面的例子你看一遍差不多能明白是怎么回事了。

    回复
    0
  • 阿神

    阿神2017-04-11 09:11:01

    https://3v4l.org/1OVmo

    class Request 
    {
        public function hello()
        {
            return 'hello ';
        }
    }
    
    class App
    {
        public function name()
        {
            return 'the app';
        }
        public function response(Request $req, App $app)
        {
            return $req->hello().$app->name();
        }
    }
    
    
    //依赖查找 or 自动依赖注入
    $c['App']     = new App;
    $c['Request'] = new Request;
    
    $r      = new ReflectionMethod('App', 'response');
    $params = $r->getParameters();
    $params = array_map(function($p) use ($c) {
        $className = $p->getClass()->name;
        return $c[$className]??null;
    }, $params);
    
    $res = $r->invokeArgs($c['App'], $params);
    
    
    //手动依赖注入
    $app = new App;
    $req = new Request;
    $res = $app->response($req, $app);

    回复
    0
  • 取消回复