对付程序设计来说,源码是最好的老师,统统的观点通过描述或者加工后,都会存在意义上的偏差,只有通过理解源码才能真正领会个中的含义。这里给出Laravel框架中关于做事容器类实现的部分源码,通过与上面实例的对照,并结合Laravel框架容器类的示意图,进一步理解实现的方法和思想,加深对IoC等观点的理解。详细代码如下:
做事容器类中定义了两个用于管理做事的属性,分别是$bindings和$instances,个中$bindings用于存储供应做事的回调函数,而$instances用于存储程序中共享的实例,也可以称为单例。
这几个函数实现了Laravel框架中做事容器的做事绑定功能,紧张是由bind()函数实现的。singleton()函数实现的是单例绑定,即程序中如果没有做事名称对应的实例工具,则通过做事容器实例化一个后并进行记录,如果在后续程序中还须要同名的做事时则返回先前创建的做事实例工具。该函数相称于bind()函数的一个特例,即参数$shared值为true的情形。对付bind()函数实现的做事绑定功能,在忽略$shared参数的情形下,即不谈论单例还是普通的做事,可以分为两种情形,如果参数$concrete为一个回调函数,则直接将回调函数与做事名称$abstract进行绑定;如果参数$concrete为一个名称,则首先须要通过getClosure()函数创建做事回调函数,然后将该回调函数与做事名称绑定,总之须要实现一个可以天生相应做事实例工具的回调函数与做事名称进行绑定。接下来先容做事解析的实现,代码如下:

做事解析过程略微繁芜一点,可以将其分为两个步骤来完成,一个是完成对应做事的查找,另一个是完成做事的实现,一样平常是指完成实例化工具的创建。这两个步骤分别由make()和build()函数完成。首先先容做事查找过程,即由make()函数实现的功能。该函数须要供应两个参数,分别是$abstract和$parameters,$abstract可以看做是做事名称,而$parameters是创建实例化工具须要的参数,即一个类实例化时的依赖。对付做事的查找是根据做事名称$abstract来进行的,首先通过getAlias()函数来查找做事名称是否有别名,对付做事别名的管理是通过做事容器类中的$aliases数组属性实现的,而内容基本是通过Illuminate\Foundation\Application类中的registerCoreContainerAliases()函数注册的,如一个大略的实例,Illuminate\Contracts\Container\Container抽象类的别名为“app”,如果查找到了别名,将查找该别名对应的做事,如果该抽象类没有别名,则连续进行查找。然后在做事容器的共享实例数组($instances属性)中查找做事名称的实例,如果查找到则解释该做事名称对应为单例,直接返回先前实例化的工具,否则连续查询。接下来,会通过getConcrete()获取做事名称的实体,在做事绑定时,一个做事名称一样平常绑定一个回调函数用于天生实例工具,而这个回调函数就相称于做事名称的实体。这个实体的查找便是通过容器中的$bindings数组属性实现的,如果查找到则返回实体,否则修正做事名称的形式连续下一次的查找。然后,会通过isBuildable()函数判断做事实体能否创建实例化工具,如果可以则转到下一个步骤,否则连续通过make()函数来查找。在完成实例工具的创建后,通过isShared()判断该做事是否为单例,如果是须要在共享实例工具数组($instances)中记录。下面先容实例化工具的创建步骤,代码如下:
在通过make()函数查找到做事实体后,会将其通报给build()函数用于工具的创建,如果做事实体便是一个闭包函数,则直接调用该闭包函数完成做事实例化工具的创建,如果做事实体只是一个详细类的类名,则须要通过反射机制来完成实例化工具的创建。通过反射机制完成工具实例化的过程,首先是根据将要实例化的类名称获取反射类(ReflectionClass)实例,然后获取该类在实例化过程中的依赖,即布局函数须要的参数,在build()函数中,通过getDependencies()函数来实现依赖的天生,如果在做事解析时供应了相应的参数,即通过$parameters参数供应,则直策应用供应的参数,如果没有供应,则通过做事容器中的resolveNonClass()函数来获取默认参数,或者通过resolveClass()函数来创建,而创建的办法也是通过做事容器,以是做事容器办理依赖注入的问题便是通过这部分代码实现的。在办理了依赖的问题后,可以直接通过反射机制完成做事实例工具的创建。通过在Laravel框架源码的根本上剖析做事容器的实现过程,读者该当对做事容器的观点、IOC模式及依赖注入等观点有了进一步的理解,在后续章节中,还会在实际运用中多次碰着这些观点,节制这部分内容对付后面理解Laravel框架的事情过程将十分有益。