laravel 依赖注入

<?php interface  Animal{

     public  function attack();     public  function talk();

 }

class People implements Animal{    public  $month;    public  $hand;    public  function __construct(Mouth $mouth,Hand $hand)    {        $this->month = $mouth;        $this->hand  = $hand;

    }

    public  function attack()    {        $this->hand->scrap();    }

    public  function talk()    {       $this->month->say();    }

}

class  Mouth{    public  function say(){        echo "咿咿呀呀";    }}class  Hand{    public  $finger;    public  function __construct(Finger $finger)    {        $this->finger = $finger;    }

    public  function scrap(){        echo ‘仍玩具‘;    }

    public  function otherFunction(){        $this->finger->eatFinger();    }}

class Finger{     public  function eatFinger(){         echo "吃手指";     }}

class Container{    /**     *  容器绑定,用来装提供的实例或者 提供实例的回调函数     * @var array     */    public $building = [];

    /**     * 注册一个绑定到容器     */    public function bind($abstract, $concrete = null, $shared = false){    if(is_null($concrete)){        $concrete = $abstract;    }

    if(!$concrete instanceOf Closure){        $concrete = $this->getClosure($abstract, $concrete);    }

    $this->building[$abstract] =  compact("concrete", "shared");}

    //注册一个共享的绑定 单例    public function singleton($abstract, $concrete, $shared = true){    $this->bind($abstract, $concrete, $shared);}

    /**     * 默认生成实例的回调闭包     *     * @param $abstract     * @param $concrete     * @return Closure     */    public function getClosure($abstract, $concrete){    return function($c) use($abstract, $concrete){        $method = ($abstract == $concrete)? ‘build‘ : ‘make‘;        return $c->$method($concrete);    };}

    /**     * 生成实例     */    public function make($abstract){    $concrete = $this->getConcrete($abstract);

    if($this->isBuildable($concrete, $abstract)){        $object = $this->build($concrete);    }else{        $object = $this->make($concrete);    }

    return $object;}

    /**     * 获取绑定的回调函数     */    public function getConcrete($abstract){

    if(! isset($this->building[$abstract])){        return $abstract;    }

    return $this->building[$abstract][‘concrete‘];}

    /**     * 判断 是否 可以创建服务实体     */    public function isBuildable($concrete, $abstract){

    return $concrete === $abstract || $concrete instanceof Closure;    }

    /**     * 根据实例具体名称实例具体对象     */    public function build($concrete){

    if($concrete instanceof Closure){        return $concrete($this);    }

    //创建反射对象    $reflector = new ReflectionClass($concrete);//通过反射获取类名

    if( ! $reflector->isInstantiable()){        //抛出异常        throw new \Exception(‘无法实例化‘);    }

    $constructor = $reflector->getConstructor();//获取构造函数    if(is_null($constructor)){        return new $concrete;    }

    $dependencies = $constructor->getParameters();//获取构造函数参数    $instance = $this->getDependencies($dependencies);    return $reflector->newInstanceArgs($instance);//将参数注入到对象中

}

    //通过反射解决参数依赖    public function getDependencies(array $dependencies){    $results = [];    foreach( $dependencies as $dependency ){        $results[] = is_null($dependency->getClass())            ?$this->resolvedNonClass($dependency)            :$this->resolvedClass($dependency);    }

    return $results;}

    //解决一个没有类型提示依赖    public function resolvedNonClass(ReflectionParameter $parameter)    {    if($parameter->isDefaultValueAvailable()){        return $parameter->getDefaultValue();    }    throw new \Exception(‘出错‘);

    }

    //通过容器解决依赖    public function resolvedClass(ReflectionParameter $parameter)    {         return $this->make($parameter->getClass()->name);

    }

}//实例化容器类$container =  new Container();$container->bind(‘Animal‘,‘People‘);//将需要创建对象的类放到容器中$people  = $container->make(‘Animal‘);//创建对象$people->attack();//调用方法$people->talk();

原文地址:https://www.cnblogs.com/paulversion/p/11703522.html

时间: 2024-10-12 15:10:01

laravel 依赖注入的相关文章

Laravel依赖注入(DI)和Ioc容器

原文地址:http://lixiangfeng.com/blog/article/content/7908531 Laravel这个框架,用起来方便,理解起来不简单. 为什么不简单?因为包含了一大堆所谓"先进"的概念,其中依赖注入(DI)和Ioc容器是比较核心的内容之一. 我百度了一下,讲PHP DI和Ioc的内容很少,更别说详解Laravel ioc的了. 在这里,我综合了几篇写得比较典型的文章,以一个产品经理的身份,从用户体验的角度尝试让初学者也能比较容易理解这个2个概念. DI和

php+laravel依赖注入浅析

laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('config');$connection = new Connection($this->config); 比较好理解,这样的好处就是不用直接 new 一个实例了,方法传值没啥改变,还可以多处共享此实例. 但这跟依赖注入有什么关系,真正的依赖注入是不需给方法传递任何参数值,只需要指明方法参数类型,代码自动

laravel依赖注入浅析

laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好. 通常我们的调用如下. $config = $container->make('config');$connection = new Connection($this->config); 比较好理解,这样的好处就是不用直接 new 一个实例了,方法传值没啥改变,还可以多处共享此实例. 但这跟依赖注入有什么关系,真正的依赖注入是不需给方法传递任何参数值,只需要指明方法参数类型,代码自动

[PHP] Laravel 依赖注入使用不当引起的内存溢出

业务逻辑: 正常在 controller 方法的参数中注入某个类,方法中使用这个类时发生内存超出提示. 分析: 过往显示,正常使用依赖注入是不存在问题的,那么很有可能是哪里发生了循环引用,导致一直请求某个操作而消耗内存. 排查: 业务逻辑没有任何问题. 在定义路由时,该路由指定了某个中间件,需要排查中间件的 handle 实现. handle 中只做了一件事,检测当某个条件不满足时会调用 return app(Controller::class)->returnValue(); 我们知道 app

理解 PHP 依赖注入 | Laravel IoC容器

Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,提高初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据库连接一直到通过容器加载服务这个高度解耦的设计展示了依赖注入的强大之处,值得我们借鉴和学习. -----------------------------------------------------------分割线下面是大牛的原文---------------------------------

Laravel 服务容器 IoC(控制反转) 和 DI(依赖注入)

Laravel 服务容器 IoC(控制反转) 和 DI(依赖注入) IoC 容器, laravel 的核心 Laravel 的核心就是一个 IoC 容器,根据文档,称其为“服务容器”,顾名思义,该容器提供了整个框架中需要的一系列服务.作为初学者,很多人会在这一个概念上犯难,因此,我打算从一些基础的内容开始讲解,通过理解面向对象开发中依赖的产生和解决方法,来逐渐揭开“依赖注入”的面纱,逐渐理解这一神奇的设计理念. 本文一大半内容都是通过举例来让读者去理解什么是 IoC(控制反转) 和 DI(依赖注

/laravel IOC理解以及依赖注入

废话不说直接上实例 //laravel IOC理解以及依赖注入 DIinterface SuperModuleInterface{    /**      * 超能力激活方法      *      * 任何一个超能力都得有该方法,并拥有一个参数      *@param array $target 针对目标,可以是一个或多个,自己或他人      */     public function activate(array $target); }class XPower implements S

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数. 01 <?php 02   0

laravel中如何利用反射实现依赖注入

依赖注入 在一个类中经常会依赖于其他的对象,先看一下经典的写法 class Foo { public $bar; public function __construct() { $this->bar = new Bar(); } } $foo = new Foo(); 当类的依赖发生改变时,比如 Bar 这个类需要实例化参数时,而依赖于它的类有很多,总不能一个一个地去修改吧. 再看一下使用 依赖注入 怎么做 class Foo { public $bar; public function __c