您的位置:首页 > 编程语言 > PHP开发

每天laravel-20160813| Container -16

2016-05-24 09:31 645 查看
/**
* Get the contextual concrete binding for the given abstract.
*
* @param  string  $abstract
* @return string|null
*/
protected function getContextualConcrete($abstract)
{
if (isset($this->contextual[end($this->buildStack)][$abstract])) {
return $this->contextual[end($this->buildStack)][$abstract];
}
}//has it then return it,
// this array is too complex

/**
* Normalize the given class name by removing leading slashes.
*
* @param  mixed  $service
* @return mixed
*/
protected function normalize($service)
{
return is_string($service) ? ltrim($service, '\\') : $service;// back the normal string like namespace
}// Normalize the given class name by removing leading slashes

/**
* Get the extender callbacks for a given type.
*
* @param  string  $abstract
* @return array
*/
protected function getExtenders($abstract)
{
if (isset($this->extenders[$abstract])) {// has then return
return $this->extenders[$abstract];
}

return [];
}// Get the extender callbacks for a given type.

/**
* Instantiate a concrete instance of the given type.
*
* @param  string  $concrete
* @param  array   $parameters
* @return mixed
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
// make a concrete instance of the given type live.
public function build($concrete, array $parameters = [])// like to make a floor
{
// If the concrete type is actually a Closure, we will just execute it and
// hand back the results of the functions, which allows functions to be
// used as resolvers for more fine-tuned resolution of these objects.
if ($concrete instanceof Closure) {
return $concrete($this, $parameters);
}// if it a concrete as Closure.

$reflector = new ReflectionClass($concrete);// else throw the concrete function to get the class name

// If the type is not instantiable, the developer is attempting to resolve
// an abstract type such as an Interface of Abstract Class and there is
// no binding registered for the abstractions so we need to bail out.
if (! $reflector->isInstantiable()) {// if it a abstract class so can not be instance
if (! empty($this->buildStack)) {// if has the buildStack
$previous = implode(', ', $this->buildStack);//implode the buildStack

$message = "Target [$concrete] is not instantiable while building [$previous].";// it is a trace
} else {
$message = "Target [$concrete] is not instantiable.";
}

throw new BindingResolutionException($message);// throw a Exception
}

$this->buildStack[] = $concrete;// add the concrete to the concrete

$constructor = $reflector->getConstructor();// get the Constructor

// If there are no constructors, that means there are no dependencies then
// we can just resolve the instances of the objects right away, without
// resolving any other types or dependencies out of these containers.
if (is_null($constructor)) {
array_pop($this->buildStack);// if no has the array_pop  delete the concrete

return new $concrete;// return new concrete
}

$dependencies = $constructor->getParameters();//get parameters

// Once we have all the constructor's parameters we can create each of the
// dependency instances and then use the reflection instances to make a
// new instance of this class, injecting the created dependencies in.
$parameters = $this->keyParametersByArgument(
$dependencies, $parameters
);// get

$instances = $this->getDependencies(
$dependencies, $parameters
);

array_pop($this->buildStack);

return $reflector->newInstanceArgs($instances);
}// build function is so powerful, can use a instance and a parameters to new a new instance.


本文出自 “专注php” 博客,请务必保留此出处http://jingshanls.blog.51cto.com/3357095/1782385
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: