/**
    * Add a contextual binding to the container.
    *
    * @param  string  $concrete
    * @param  string  $abstract
    * @param  \Closure|string  $implementation
    * @return void
    */
   public function addContextualBinding($concrete, $abstract, $implementation)
   {
       $this->contextual[$this->normalize($concrete)][$this->normalize($abstract)] = $this->normalize($implementation);
   }// Add a contextual binding to the container.
// a Two dimensional array used to save the implementation value.

   /**
    * Register a binding if it hasn't already been registered.
    *
    * @param  string  $abstract
    * @param  \Closure|string|null  $concrete
    * @param  bool  $shared
    * @return void
    */
   public function bindIf($abstract, $concrete = null, $shared = false)
   {
       if (! $this->bound($abstract)) {// this->bound
           $this->bind($abstract, $concrete, $shared);// bind the parameter
       }
   }// check binding , if not has binding it.

   /**
    * Register a shared binding in the container.
    *
    * @param  string|array  $abstract
    * @param  \Closure|string|null  $concrete
    * @return void
    */
   public function singleton($abstract, $concrete = null)
   {
       $this->bind($abstract, $concrete, true);// bind the parameter
   }// Register a shared binding in the container.