/**
  * Wrap a Closure such that it is shared.
  *
  * @param  \Closure  $closure
  * @return \Closure
  */
 public function share(Closure $closure)// because this so we need php version is 5.4+
 {// Wrap a closure such that is shared
     return function ($container) use ($closure) {
         // We'll simply declare a static variable within the Closures and if it has
         // not been set we will execute the given Closures to resolve this value
         // and return it back to these consumers of the method as an instance.
         static $object;// check has, or closure it.

         if (is_null($object)) {
             $object = $closure($container);// use a closure class to bind to the container
         }

         return $object;
     };// a Closure class is a special class
 }

 /**
  * "Extend" an abstract type in the container.
  *
  * @param  string    $abstract
  * @param  \Closure  $closure
  * @return void
  *
  * @throws \InvalidArgumentException
  */
 public function extend($abstract, Closure $closure)// a extend type ,parameter is a abstract class,and other is closure.
 {
     $abstract = $this->normalize($abstract);// get  a normal string that we need

     if (isset($this->instances[$abstract])) {// check it is set in the instance array,
         $this->instances[$abstract] = $closure($this->instances[$abstract], $this);
// if isset ,use the closure function to action about it.
         $this->rebound($abstract);// get the rebound function
     } else {
         $this->extenders[$abstract][] = $closure;// set the extender
     }
 }