依赖注入容器了解
耦合
一个好的代码构造设计肯定是松耦合的,这也是不少通用设计模式的主旨,就是把扩散正在遍地的同一个性能的代码汇聚到一同,构成一个模块,而后正在没有同模块之间经过一些粗大的、明白的渠道进行沟通。
正在理论中,没有同性能以及模块之间的相互依赖是不成防止的,而若何解决好这些依赖之间的关系则是代码构造是否变患上美妙的要害。
<?php class User { public function register($user) { // 注册操作 ... // 发送确认邮件 $notify = new Notify(); $notify->sendEmail('register', $user); } } class Notify { public function sendEmail($type, $data) { switch $type { case 'register': // 发送注册确认邮件 $email = new Email($type); $email->send($data); ... } } } class Email { public function send($data) { // 发送邮件 } }
上述代码中,三个类之间逐层依赖,三个类实例化的程序是 User -> Notify -> Email
也就是说我先实例化User类,可能执行了一些代码之后再去实例化我需求的其余类,比方Notify,以此类推。
这类依赖会让咱们不能不为了失去需求的依赖而去做的一些预备工作,有时分可能一个new操作还不敷。而这局部工作就是所说的耦合,他会让一个自力性能的类不能不去关怀一些以及本人的主体性能没甚么关系的操作。
解除了一个类对其余类的依赖
要处理这个成绩也很简略,我能够先实例化好Email类,而后再实例化Notify,而后把Email工具作为参数传给Notify,最初实例化User类,而后把Notify传出来。这就是所谓的依赖注入,能够看到这个进程中类实例化的程序齐全反过去了,先实例化被依赖的工具,而没有是先实例化终极需求的工具,这是管制反转。
代码以下:
<?php $email = new Email(); $notify = new Notify($email); $user = new User($notify);
能够经过结构函数来注入需求的依赖,也能够用一些其余的办法。
用容器托管依赖
那又有新的成绩,例子中只有三个类还好,那假如这个User类依赖Notify来发邮件,依赖Model来存数据库,依赖redis来缓存,这样诚然把依赖关系转移到了类的内部,但仍是会招致我只想实例化一下User的时分,却要手动做不少的预备工作,会让代码凌乱。以是这个时分需求一个容器。而这个容器的作用就是替我来治理这些依赖。
<?php // 容器 class Container implements ArrayAccess { protected $values = []; public function offsetGet($offset) { return $this->values[$offset]($this); } public function offsetSet($offset, $value) { $this->values[$offset] = $value; } }
正在顺序启动的时分,咱们能够正在一个中央对立的注册好一系列的根底效劳。
<?php $container = new Container(); $container['notify'] = function($c) { return new Notify(); }; $container['email'] = function($c) { return new Email(); };
就会变为这样 就是当User需求Notify的时分,会去向容器要这个类的工具,那至于Notify再依赖甚么其余的货色,我就不必管了,由于Notify也会去向容器要它本人需求的依赖。一切这些依赖关系的解决就齐全托管给容器了,咱们既没有需求去关怀依赖之间的条理关系,也防止了依赖之间的耦合。 需求留意的是,依赖注入容器普通只承受一个匿名函数,而没有是一个实例化好的工具,匿名函数会通知容器怎么去取得一个工具,这样能够使患上一个效劳正在被需求的时分才会去实例化<?php
class User
{
public function register($user)
{
// 注册操作
...
// 发送确认邮件
$container('notify')->sendEmail('register', $user);
}
}
class Notify
{
public function sendEmail($type, $data)
{
switch $type {
case 'register':
// 发送注册确认邮件
$email = $container['email'];
$email->send($data);
...
}
}
}
class Email
{
public function send($data)
{
// 发送邮件
}
}
以上就是浅显易懂了解PHP依赖注入容器的具体内容,更多请存眷资源魔其它相干文章!
标签: php教程 依赖注入 php故障解决 php使用问题
抱歉,评论功能暂时关闭!