关于laravel 自动加载和依赖注入、服务容器、服务提供者的理解--1
来源:互联网 发布:什么是键值数据库 编辑:程序博客网 时间:2024/05/16 10:01
参考实例
http://laravelacademy.org/post/769.html
- Laravel中 使用composer下载包时 会在vendor下有个autoload.php文件
这个autoload.php文件解决的是自动加载的问题,通俗点讲:就是通过 _autoload 或者 spl_autoload_register 来解决频繁使用require_once 的问题
_autoload是在new Class实例化的时候自动调用的函数
- 依赖注入:通俗点讲:就是在一个class a中 需要new 另外一个class B 那么在实例化a的时候就依赖B 它解决的是何时去new Class 实例化的问题
class a{
Private $b;
Public function __construct(){
$b = new B();
}
}
工厂模式 : 通俗点说,就是在一个类中 将所有的 new Class 实例化的工作去交给一个工厂类去办,工厂类直接返回实例
class SuperModuleFactory
{
public function makeModule($moduleName, $options)
{
switch ($moduleName) {
case 'Fight':
return new Fight($options[0], $options[1]);
case 'Force':
return new Force($options[0]);
case 'Shot':
return new Shot($options[0], $options[1], $options[2]);
}
}
}
class Superman
{
protected $power;
public function __construct()
{
// 初始化工厂
$factory = new SuperModuleFactory;
// 通过工厂提供的方法制造需要的模块
$this->power = $factory->makeModule('Fight', [9, 100]);
// $this->power = $factory->makeModule('Force', [45]);
// $this->power = $factory->makeModule('Shot', [99, 50, 2]);
/*
$this->power = array(
$factory->makeModule('Force', [45]),
$factory->makeModule('Shot', [99, 50, 2])
);
*/
}
}
IoC模式:通俗点说,就是不去new Class啦,在一个类中如果需要另外一个class,那么就直接将这个class的实例作为参数传递进去
class Superman
{
protected $module;
public function __construct(SuperModuleInterface $module)
{
$this->module = $module;
}
}
// 超能力模组
$superModule = new XPower;
// 初始化一个超人,并注入一个超能力模组依赖
$superMan = new Superman($superModule);
public function store(Request $request) //这里$request 就是Request类的实例 作为参数传递进来 直接使用$request来获取get或者post过来的数据
{
$name => $request->name,
$email=> $request->email,
}
IoC容器:通俗点说,就是升级版的“超级工厂” 也就是将IoC和工厂模式结合起来,通过向“超级工厂”添加闭包函数来将IoC模式中的new XPower new Superman通过工厂模式生产出来
class Container
{
protected $binds;
protected $instances;
public function bind($abstract, $concrete)
{
if ($concrete instanceof Closure) {
$this->binds[$abstract] = $concrete;
} else {
$this->instances[$abstract] = $concrete;
}
}
public function make($abstract, $parameters = [])
{
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
array_unshift($parameters, $this);
return call_user_func_array($this->binds[$abstract], $parameters);
}
}
// 创建一个容器(后面称作超级工厂)
$container = new Container;
// 向该 超级工厂添加超人的生产脚本
$container->bind('superman', function($container, $moduleName) {
return new Superman($container->make($moduleName)); //重点注意这里 $container->make($moduleName)就是IoC模式中 向Superman类注入的实例
});
// 向该 超级工厂添加超能力模组的生产脚本
$container->bind('xpower', function($container) {
return new XPower;
});
// 同上
$container->bind('ultrabomb', function($container) {
return new UltraBomb;
});
// ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', 'xpower');
$superman_2 = $container->make('superman', 'ultrabomb');
$superman_3 = $container->make('superman', 'xpower');
// ...随意添加
laravel中的服务容器 其实就是一个IoC容器 服务器提供者其实就是将bind,make这些同一放到一个serviceProvider类中
关于服务容器,服务提供者的进一步理解请参考 <<laravel关键技术解析第150页>>
阅读全文
0 0
- 关于laravel 自动加载和依赖注入、服务容器、服务提供者的理解--1
- laravel关于服务提供者的再次理解
- laravel 服务提供者的理解
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
- 详解Laravel服务提供者 IOC(控制反转)、依赖注入
- Laravel 中的服务容器、服务、服务提供者
- laravel 服务容器service container和服务提供者service provider
- laravel服务提供者与服务容器的因果关系
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
- Laravel学习笔记(三)---Laravel 的核心, 服务容器,服务提供者
- laravel 服务类的自动注入
- 如何理解Laravel 的IOC 服务容器
- 对 laravel 中服务提供者(Provider)和 门面(Facades) 的理解
- Laravel 5 系统架构:服务提供者、服务容器、Contracts、Facades
- 最小二乘法椭圆拟合
- DataFrame操作
- 在12306购票时选择上、中、下铺
- 细说new与malloc的10点区别
- LINUX内核链表的详细解析
- 关于laravel 自动加载和依赖注入、服务容器、服务提供者的理解--1
- C++实现双向链表
- netty源码分析(七)Acceptor与Dispatcher角色分析
- 解决用PLSQL Developer连接VMWare中的Oracle 11g问题
- 解读 redux 的设计思路与用法
- 实验A—2 约瑟夫环问题
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
- C++中的enum(枚举)简介
- hdu 3065 二分图多重匹配