laravel生命周期之初识Container

本文介绍了laravel框架中的核心组件——Container,它是一个管理类的仓库和缓存。内容包括Container的工作流程、别名函数、isBuildable函数、实例化函数make和build的用法。通过学习,有助于理解laravel的依赖注入和控制反转思想。
摘要由CSDN通过智能技术生成

提到laravel框架,我的脑海中最先浮现的是什么呢?那一定是,依赖注入、控制反转。作为后来居上的框架,laravel能取得如此的成绩,优秀的思想也贡献了很大一部分力量。

什么是Container?

定义:

那么在提到依赖注入之前我们就不得不先说一说一切的根本:容器Container。所谓容器,听名字就知道,是一个仓库,装东西用的,所以,container所有的功能,都围绕一个主题:管理类。

工作流程:

首先,生成一个数组绑定列表,用自定义名称作为主键,然后键值是闭包(输入的可能是闭包或者实体类,但是,在存储的时候,都统一转化成了闭包存储)。
其次,根据绑定列表,生成对应的类的实例,供用户使用,调用的时候,发现如果已经生成,不需要重新生成使用,实际上,Container就是类的一个仓库,以及缓存。
在laravel中Container的实现类为\Illuminate\Container\Container,该类提供了多个操作类的方法。
在这里插入图片描述
Container位于…/vendor/laravel/framework/src/Illuminate/Container/Container.php中,接下来我们来看下其常用方法(因版本不同,源码可能略有偏差,如果问题,欢迎留言指正!!!

别名函数:
	/**
     * 此方法会给abstract类设置一个alias别名
     */
    public function alias($abstract, $alias)
    {
   
        $this->aliases[$alias] = $abstract;

        $this->abstractAliases[$abstract][] = $alias;
    }
    /**
    *此方法会获取abstract的别名,如果abstract本身为别名则直接返回
    **/
    public function getAlias($abstract)
    {
   
        if (! isset($this->aliases[$abstract])) {
   
            return $abstract;
        }

        if ($this->aliases[$abstract] === $abstract) {
   
            throw new LogicException("[{
     $abstract}] is aliased to itself.");
        }

        return $this->getAlias($this->aliases[$abstract]);
    }
    /**
    *判断$name是否为别名
    **/
    public function isAlias($name)
    {
   
        return isset($this->aliases[$name]);
    }
isBuildable函数:

用来判断指定类型是否可构建(实例化)。满足二者之一则可实例化:实际类型是Closure或者实际类型与抽象类型名称相同(其实就是普通的类名称,非抽象类和接口)

protected function isBuildable($concrete, $abstract)
{
   
    return $concrete === $abstract || $concrete instanceof Closure;
}

容器绑定函数:bind、singleton

singleton是单例的,是bind函数share的一个应用。

public function bind($abstract, $concrete = null, $shared = false)
    {
   
        // 删除所有陈旧的实例和别名
        $this->dropStaleInstances(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值