PHP经验分享PHP开发

浅析【IOC思想】(及Laravel实例应用)

2022-01-27  本文已影响0人  Bryanz

<输入的最好方式就是输出>,本着学习的态度表达一下自己浅显的理解。IOC(Inversion of Control),即控制反转,是面向对象中的一种设计原则。下面我将简单介绍IOC的作用实现原理,最后用具体的示例应用来帮助加深理解。

1、IOC的作用

IOC可以作为依赖对象统一管理者,从而降低代码的耦合性,提升程序的可维护性。

2、实现原理

IOC作为管理依赖的容器,涉及的相关技术是反射依赖注入
下面将简单介绍PHP反射依赖注入

$node = new LinkNode();//实例化对象
$nodeClass = new ReflectionClass($node);//通过对象获取其反射类
$properties = $nodeClass->getProperties();//获取类的所有属性
$methods = $nodeClass->getMethods();//获取类的所有方法

上图代码块介绍了依赖注入的作用,例子中UserManager类需要依赖Mailer类。通过注入的方式可避免手动实例化依赖对象,即调用UserManager时可以不用手动实例化依赖对象。

标红的两块则是IOC容器实现依赖注入的技术,autowiring(自动装载)PHP's Reflection classes(PHP反射类)。autowiring可以扫描代码找到类的构造函数所需要的参数是什么(本例中是Mailer对象),php-di通过php反射类即可找到Mailer类并实例化对象。php反射类前面已经介绍过了,下面介绍下autowiring的原理。

2-autowiring

上图第一个红框表明,容器可以通过自动装载自动创建和注入依赖;第二个红框表示注入的过程等同于先实例化对象,再传递给构造函数的参数。另外文档还指出,构造函数的参数必须要有类型提示才能实现注入。
php-di注入的方式其实不止autowiring这一种,总共有三种:autowiring(自动装载)、annotation(注解)、PHP definitions(PHP定义),感兴趣的小伙伴可以自行查阅文档相关内容。

总结:IOC容器通过依赖注入的方式帮我们管理类的依赖关系,而不需要我们手动去管理依赖(实例化依赖对象)。本文的php依赖注入利用php反射找到依赖信息,autowiring自动加载实现构造参数的注入。

3、示例应用(Laravel)

纸上得来终觉浅,简单介绍完IOC容器的实现原理,现在以laravel为例具体实践应用一下,有助于加深理解。示例主要涉及两个层面,一个将类的依赖关系绑定到容器;另一个是从容器中解析类。
Laravel官方文档
英文版:https://laravel.com/docs/8.x/container#when-to-use-the-container
中文版:https://learnku.com/docs/laravel/8.5/container/10365#120d42

以上只是简单介绍了一下Laravel容器的依赖绑定和使用,方便理解IOC容器的运作过程

实际上绑定过程还涉及到Laravel的核心<服务提供者>,我们需要在提供者的register注册方法中绑定相关依赖;绑定的类型也有很多种,可分为单例绑定(每次解析都是单例对象),接口绑定(自动解析注入的接口为指定实现类)等等,这边暂时不展开,感兴趣的小伙伴可以自行查阅文档。

上一篇 下一篇

猜你喜欢

热点阅读