IOC容器的繫結解析過程(繫結單例)

HelloWorld-Q發表於2020-09-23
<?php

namespace Laravel\Container;

class Container
{

    //存放例項 陣列
  protected $bindings = [];

  //共享容器  存在共享"例項"
  protected $instances = [];


 /** * 繫結物件
  * @param $abstract 標識
  * @param null $concrete 具體的物件 - 字串,閉包,例項
  * @param bool $shared
  */
  public function bind($abstract, $concrete = null, $shared = false)
    {

        $this->bindings[$abstract]['shared'] = $shared;
        $this->bindings[$abstract]['concrete'] = $concrete;

    }

    public function getBindings()
    {

    // var_dump($this->bindings);
    }

    /**
 * 解析獲取例項
  * @param $abstract 標識
  * @param array $parameters 引數
  * @return mixed 例項
  */
   public function make($abstract, $parameters = [])
    {
        //1 是否存在
       if (!$this->has($abstract)) {
            new \Exception('你提供的不存在');
        }

        //2判斷是否在共享容器中
      if ($this->instances[$abstract]) {
            return $this->instances[$abstract];
      }

        $object = $this->bindings[$abstract]['concrete'];

      //3判斷是否是閉包
      if ($object instanceof \Closure) {
      return $object();
      }

        //4構建例項
      if (!is_object($object)) {
                $object = new $object(...$parameters);
      }

        // 5.進行共享
      if ($this->bindings[$abstract]['shared']) {
                $this->instances[$abstract] = $object;
      }
        return $object;

  }

 /**
 * 繫結一個單例
  * @param $abstract 標識
  * @param null $concrete 具體的物件 - 字串,閉包,例項
  * @param bool $shared
  */
   public function singleton($abstract, $concrete = null, $shared = true)
    {
        $this->bind($abstract, $concrete, $shared);
    }

    /**
     * 判斷 標識對應的值是否存在
      * @param $abstract 標識
      * @return bool
     */ 
   public function has($abstract)
    {
        return isset($this->bindings[$abstract]['concrete']) ||
    isset($this->instances[$abstract]['concrete']);
   }
}

IOC容器的繫結解析過程(簡單版)

IOC容器的繫結解析過程(簡單版)

本作品採用《CC 協議》,轉載必須註明作者和本文連結
有夢想的人睡不著,沒有夢想的人睡不醒。

相關文章