站长资讯网
最全最丰富的资讯网站

laravel的核心是什么

laravel的核心是服务容器,也就是IOC容器。该容器提供了整个框架中需要的一系列服务,其中包含了依赖注入和控制反转两部分,控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

laravel的核心是什么

本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。

laravel的核心是什么

服务容器,也叫IOC容器,其实包含了依赖注入(DI)和控制反转(IOC)两部分,是laravel的真正核心。其他的各种功能模块比如 Route(路由)、Eloquent ORM(数据库 ORM 组件)、Request and Response(请求和响应)等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被你所使用,其实都是 laravel 的服务容器负责的。服务容器这个概念比较难解释清楚,只能一步步从服务容器的产生历史慢慢解释

该容器提供了整个框架中需要的一系列服务。

IoC 容器诞生的故事——石器时代(原始模式)

我们把一个“超人”作为一个类,

class Superman {}

我们可以想象,一个超人诞生的时候肯定拥有至少一个超能力,这个超能力也可以抽象为一个对象,为这个对象定义一个描述他的类吧。一个超能力肯定有多种属性、(操作)方法,这个尽情的想象,但是目前我们先大致定义一个只有属性的“超能力”,至于能干啥,我们以后再丰富:

class Power {     /**      * 能力值      */     protected $ability;     /**      * 能力范围或距离      */     protected $range;     public function __construct($ability, $range)     {         $this->ability = $ability;         $this->range = $range;     } }

这时候我们回过头,修改一下之前的“超人”类,让一个“超人”创建的时候被赋予一个超能力:

class Superman {     protected $power;     public function __construct()     {         $this->power = new Power(999, 100);     } }

这样的话,当我们创建一个“超人”实例的时候,同时也创建了一个“超能力”的实例,但是,我们看到了一点,“超人”和“超能力”之间不可避免的产生了一个依赖。

所谓“依赖”,就是“我若依赖你,少了你就没有我”。

在一个贯彻面向对象编程的项目中,这样的依赖随处可见。少量的依赖并不会有太过直观的影响,我们随着这个例子逐渐铺开,让大家慢慢意识到,当依赖达到一个量级时,是怎样一番噩梦般的体验。当然,我也会自然而然的讲述如何解决问题。

之前的例子中,超能力类实例化后是一个具体的超能力,但是我们知道,超人的超能力是多元化的,每种超能力的方法、属性都有不小的差异,没法通过一种类描述完全。我们现在进行修改,我们假设超人可以有以下多种超能力:

飞行,属性有:飞行速度、持续飞行时间

蛮力,属性有:力量值

能量弹,属性有:伤害值、射击距离、同时射击个数

我们创建了如下类:

class Flight {     protected $speed;     protected $holdtime;     public function __construct($speed, $holdtime) {} } class Force {     protected $force;     public function __construct($force) {} } class Shot {     protected $atk;     protected $range;     protected $limit;     public function __construct($atk, $range, $limit) {} }

好了,这下我们的超人有点“忙”了。在超人初始化的时候,我们会根据需要来实例化其拥有的超能力吗,大致如下:

class Superman {     protected $power;     public function __construct()     {         $this->power = new Fight(9, 100);         // $this->power = new Force(45);         // $this->power = new Shot(99, 50, 2);         /*         $this->power = array(             new Force(45),             new Shot(99, 50, 2)         );         */     } }

我们需要自己手动的在构造函数内(或者其他方法里)实例化一系列需要的类,这样并不好。可以想象,假如需求变更(不同的怪物横行地球),需要

赞(1)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号