PHP 控制反转 (IoC)


IoC 概念

Inversion of Control 控制反转

控制反转 是面向对象编程中的一种 设计原则,可以用来减低计算机代码之间的耦合度。

有什么作用

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。

IoC这个设计原则试图在面向对象编程中去掉所有相互依赖的现象。这个原则对于复杂的系统来说是很重要的。它使得对象具有更好的多态性和封装性。相互依赖的现象越少,就越容易单独测试某个组件。 ^1

控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模块的类中直接通过new来获取。

如何实现 ^2

  • 方法之一: 工厂模式,依赖转移!

    工厂模式,顾名思义,就是一个类所依赖的外部事物的实例,都可以被一个或多个 “工厂” 创建的这样一种开发模式,就是 “工厂模式”

    <?php
    
    class Superman
    &#123;
        protected $power;
    
        public function __construct(array $modules)
        &#123;
            // 初始化工厂
            $factory = new SuperModuleFactory;
    
            // 通过工厂提供的方法制造需要的模块
            foreach ($modules as $moduleName => $moduleOptions) &#123;
                $this->power[] = $factory->makeModule($moduleName, $moduleOptions);
            &#125;
        &#125;
    &#125;
    
    // 创建超人
    $superman = new Superman([
        'Fight' => [9, 100],
        'Shot' => [99, 50, 2]
        ]);
  • 方法之二: 依赖注入

    只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于 依赖注入(DI)

    <?php
    class Superman
    &#123;
        protected $module;
    
        public function __construct(SuperModuleInterface $module)
        &#123;
            $this->module = $module
        &#125;
    &#125;

实现示例

<?php

namespace App\Jobs;

use App\User;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Contracts\Bus\SelfHandling;

class PurchasePodcast implements SelfHandling
&#123;
    /**
     * The mailer implementation.
     */
    protected $mailer;

    /**
     * Create a new instance.
     *
     * @param  Mailer  $mailer
     * @return void
     */
    public function __construct(Mailer $mailer)
    &#123;
        $this->mailer = $mailer;
    &#125;

    /**
     * Purchase a podcast.
     *
     * @return void
     */
    public function handle()
    &#123;
        //
    &#125;
&#125;

参考文档


Author: Itaken
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Itaken !
  TOC目录