




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第詳解如何實(shí)現(xiàn)Laravel的服務(wù)容器的方法示例為了方便維護(hù),我們把上面的數(shù)組封裝到類里面。
$instances還是上面的容器數(shù)組。我們增加兩個(gè)方法,instance用來綁定服務(wù),get用來從容器中獲取服務(wù)。
classBaseContainer
//已綁定的服務(wù)
protected$instances=[];
//綁定服務(wù)
publicfunctioninstance($name,$instance)
$this-instances[$name]=$instance;
//獲取服務(wù)
publicfunctionget($name)
returnisset($this-instances[$name])$this-instances[$name]:null;
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
$container=newBaseContainer();
//綁定服務(wù)
$container-instance('StdClass',newStdClass());
//獲取服務(wù)
$stdClass=$container-get('StdClass');
var_dump($stdClass);
3.按需實(shí)例化
現(xiàn)在我們在綁定一個(gè)對象服務(wù)的時(shí)候,就必須要先把類實(shí)例化,如果綁定的服務(wù)沒有被用到,那么類就會白白實(shí)例化,造成性能浪費(fèi)。
為了解決這個(gè)問題,我們增加一個(gè)bind函數(shù),它支持綁定一個(gè)回調(diào)函數(shù),在回調(diào)函數(shù)中實(shí)例化類。這樣一來,我們只有在使用服務(wù)時(shí),才回調(diào)這個(gè)函數(shù),這樣就實(shí)現(xiàn)了按需實(shí)例化。
這時(shí)候,我們獲取服務(wù)時(shí),就不只是從數(shù)組中拿到服務(wù)并返回了,還需要判斷如果是回調(diào)函數(shù),就要執(zhí)行回調(diào)函數(shù)。所以我們把get方法的名字改成make。意思就是生產(chǎn)一個(gè)服務(wù),這個(gè)服務(wù)可以是已綁定的服務(wù),也可以是已綁定的回調(diào)函數(shù),也可以是一個(gè)類名,如果是類名,我們就直接實(shí)例化該類并返回。
然后,我們增加一個(gè)新數(shù)組$bindings,用來存儲綁定的回調(diào)函數(shù)。然后我們把bind方法改一下,判斷下$instance如果是一個(gè)回調(diào)函數(shù),就放到$bindings數(shù)組,否則就用make方法實(shí)例化類。
classDeferContainerextendBaseContainer
//已綁定的回調(diào)函數(shù)
protected$bindings=[];
//綁定服務(wù)
publicfunctionbind($name,$instance)
if($instanceinstanceofClosure){
//如果$instance是一個(gè)回調(diào)函數(shù),就綁定到bindings。
$this-bindings[$name]=$instance;
}else{
//調(diào)用make方法,創(chuàng)建實(shí)例
$this-instances[$name]=$this-make($name);
//獲取服務(wù)
publicfunctionmake($name)
if(isset($this-instances[$name])){
return$this-instances[$name];
if(isset($this-bindings[$name])){
//執(zhí)行回調(diào)函數(shù)并返回
$instance=call_user_func($this-bindings[$name]);
}else{
//還沒有綁定到容器中,直接new.
$instance=new$name();
return$instance;
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
$container=newDeferContainer();
//綁定服務(wù)
$container-bind('StdClass',function(){
echo"我被執(zhí)行了\n";
returnnewStdClass();
//獲取服務(wù)
$stdClass=$container-make('StdClass');
var_dump($stdClass);
StdClass這個(gè)服務(wù)綁定的是一個(gè)回調(diào)函數(shù),在回調(diào)函數(shù)中才會真正的實(shí)例化類。如果沒有用到這個(gè)服務(wù),那回調(diào)函數(shù)就不會被執(zhí)行,類也不會被實(shí)例化。
4.單例
從上面的代碼中可以看出,每次調(diào)用make方法時(shí),都會執(zhí)行一次回調(diào)函數(shù),并返回一個(gè)新的類實(shí)例。但是在某些情況下,我們希望這個(gè)實(shí)例是一個(gè)單例,無論make多少次,只實(shí)例化一次。
這時(shí)候,我們給bind方法增加第三個(gè)參數(shù)$shared,用來標(biāo)記是否是單例,默認(rèn)不是單例。然后把回調(diào)函數(shù)和這個(gè)標(biāo)記都存到$bindings數(shù)組里。
為了方便綁定單例服務(wù),再增加一個(gè)新的方法singleton,它直接調(diào)用bind,并且$shared參數(shù)強(qiáng)制為true。
對于make方法,我們也要做修改。在執(zhí)行$bindings里的回調(diào)函數(shù)以后,做一個(gè)判斷,如果之前綁定時(shí)標(biāo)記的shared是true,就把回調(diào)函數(shù)返回的結(jié)果存儲到$instances里。由于我們是先從$instances里找服務(wù),所以這樣下次再make的時(shí)候就會直接返回,而不會再次執(zhí)行回調(diào)函數(shù)。這樣就實(shí)現(xiàn)了單例的綁定。
classSingletonContainerextendsDeferContainer
//綁定服務(wù)
publicfunctionbind($name,$instance,$shared=false)
if($instanceinstanceofClosure){
//如果$instance是一個(gè)回調(diào)函數(shù),就綁定到bindings。
$this-bindings[$name]=[
'callback'=$instance,
//標(biāo)記是否單例
'shared'=$shared
}else{
//調(diào)用make方法,創(chuàng)建實(shí)例
$this-instances[$name]=$this-make($name);
//綁定一個(gè)單例
publicfunctionsingleton($name,$instance)
$this-bind($name,$instance,true);
//獲取服務(wù)
publicfunctionmake($name)
if(isset($this-instances[$name])){
return$this-instances[$name];
if(isset($this-bindings[$name])){
//執(zhí)行回調(diào)函數(shù)并返回
$instance=call_user_func($this-bindings[$name]['callback']);
if($this-bindings[$name]['shared']){
//標(biāo)記為單例時(shí),存儲到服務(wù)中
$this-instances[$name]=$instance;
}else{
//還沒有綁定到容器中,直接new.
$instance=new$name();
return$instance;
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
$container=newSingletonContainer();
//綁定服務(wù)
$container-singleton('anonymous',function(){
returnnewclass
publicfunction__construct()
echo"我被實(shí)例化了\n";
//無論make多少次,只會實(shí)例化一次
$container-make('anonymous');
$container-make('anonymous');
//獲取服務(wù)
$anonymous=$container-make('anonymous');
var_dump($anonymous)
上面的代碼用singleton綁定了一個(gè)名為anonymous的服務(wù),回調(diào)函數(shù)里返回了一個(gè)匿名類的實(shí)例。這個(gè)匿名類在被實(shí)例化時(shí)會輸出一段文字。無論我們make多少次anonymous,這個(gè)回調(diào)函數(shù)只會被執(zhí)行一次,匿名類也只會被實(shí)例化一次。
5.自動注入
自動注入是Ioc容器的核心,沒有自動注入就無法做到控制反轉(zhuǎn)。
自動注入就是指,在實(shí)例化一個(gè)類時(shí),用反射類來獲取__construct所需要的參數(shù),然后根據(jù)參數(shù)的類型,從容器中找到已綁定的服務(wù)。我們只要有了__construct方法所需的所有參數(shù),就能自動實(shí)例化該類,實(shí)現(xiàn)自動注入。
現(xiàn)在,我們增加一個(gè)build方法,它只接收一個(gè)參數(shù),就是類名。build方法會用反射類來獲取__construct方法所需要的參數(shù),然后返回實(shí)例化結(jié)果。
另外一點(diǎn)就是,我們之前在調(diào)用make方法時(shí),如果傳的是一個(gè)未綁定的類,我們直接new了這個(gè)類?,F(xiàn)在我們把未綁定的類交給build方法來構(gòu)建,因?yàn)樗С肿詣幼⑷搿?/p>
classInjectionContainerextendsSingletonContainer
//獲取服務(wù)
publicfunctionmake($name)
if(isset($this-instances[$name])){
return$this-instances[$name];
if(isset($this-bindings[$name])){
//執(zhí)行回調(diào)函數(shù)并返回
$instance=call_user_func($this-bindings[$name]['callback']);
if($this-bindings[$name]['shared']){
//標(biāo)記為單例時(shí),存儲到服務(wù)中
$this-instances[$name]=$instance;
}else{
//使用build方法構(gòu)建此類
$instance=$this-build($name);
return$instance;
//構(gòu)建一個(gè)類,并自動注入服務(wù)
publicfunctionbuild($class)
$reflector=newReflectionClass($class);
$constructor=$reflector-getConstructor();
if(is_null($constructor)){
//沒有構(gòu)造函數(shù),直接new
returnnew$class();
$dependencies=[];
//獲取構(gòu)造函數(shù)所需的參數(shù)
foreach($constructor-getParameters()as$dependency){
if(is_null($dependency-getClass())){
//參數(shù)類型不是類時(shí),無法從容器中獲取依賴
if($dependency-isDefaultValueAvailable()){
//查找參數(shù)的默認(rèn)值,如果有就使用默認(rèn)值
$dependencies[]=$dependency-getDefaultValue();
}else{
//無法提供類所依賴的參數(shù)
thrownewException('找不到依賴參數(shù):'.$dependency-getName());
}else{
//參數(shù)類型是類時(shí),就用make方法構(gòu)建該類
$dependencies[]=$this-make($dependency-getClass()-name);
return$reflector-newInstanceArgs($dependencies);
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
classRedis
classCache
protected$redis;
//構(gòu)造函數(shù)中依賴Redis服務(wù)
publicfunction__construct(Redis$redis)
$this-redis=$redis;
$container=newInjectionContainer();
//綁定Redis服務(wù)
$container-singleton(Redis::class,function(){
returnnewRedis();
//構(gòu)建Cache類
$cache=$container-make(Cache::class);
var_dump($cache);
6.自定義依賴參數(shù)
現(xiàn)在有個(gè)問題,如果類依賴的參數(shù)不是類或接口,只是一個(gè)普通變量,這時(shí)候就無法從容器中獲取依賴參數(shù)了,也就無法實(shí)例化類了。
那么接下來我們就支持一個(gè)新功能,在調(diào)用make方法時(shí),支持傳第二個(gè)參數(shù)$parameters,這是一個(gè)數(shù)組,無法從容器中獲取的依賴,就從這個(gè)數(shù)組中找。
當(dāng)然,make方法是用不到這個(gè)參數(shù)的,因?yàn)樗回?fù)責(zé)實(shí)例化類,它直接傳給build方法。在build方法尋找依賴的參數(shù)時(shí),就先從$parameters中找。這樣就實(shí)現(xiàn)了自定義依賴參數(shù)。
需要注意的一點(diǎn)是,build方法是按照參數(shù)的名字來找依賴的,所以parameters中的鍵名也必須跟__construct中參數(shù)名一致。
classParametersContainerextendsInjectionContainer
//獲取服務(wù)
publicfunctionmake($name,array$parameters=[])
if(isset($this-instances[$name])){
return$this-instances[$name];
if(isset($this-bindings[$name])){
//執(zhí)行回調(diào)函數(shù)并返回
$instance=call_user_func($this-bindings[$name]['callback']);
if($this-bindings[$name]['shared']){
//標(biāo)記為單例時(shí),存儲到服務(wù)中
$this-instances[$name]=$instance;
}else{
//使用build方法構(gòu)建此類
$instance=$this-build($name,$parameters);
return$instance;
//構(gòu)建一個(gè)類,并自動注入服務(wù)
publicfunctionbuild($class,array$parameters=[])
$reflector=newReflectionClass($class);
$constructor=$reflector-getConstructor();
if(is_null($constructor)){
//沒有構(gòu)造函數(shù),直接new
returnnew$class();
$dependencies=[];
//獲取構(gòu)造函數(shù)所需的參數(shù)
foreach($constructor-getParameters()as$dependency){
if(isset($parameters[$dependency-getName()])){
//先從自定義參數(shù)中查找
$dependencies[]=$parameters[$dependency-getName()];
continue;
if(is_null($dependency-getClass())){
//參數(shù)類型不是類或接口時(shí),無法從容器中獲取依賴
if($dependency-isDefaultValueAvailable()){
//查找默認(rèn)值,如果有就使用默認(rèn)值
$dependencies[]=$dependency-getDefaultValue();
}else{
//無法提供類所依賴的參數(shù)
thrownewException('找不到依賴參數(shù):'.$dependency-getName());
}else{
//參數(shù)類型是類時(shí),就用make方法構(gòu)建該類
$dependencies[]=$this-make($dependency-getClass()-name);
return$reflector-newInstanceArgs($dependencies);
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
classRedis
classCache
protected$redis;
protected$name;
protected$default;
//構(gòu)造函數(shù)中依賴Redis服務(wù)和name參數(shù),name的類型不是類,無法從容器中查找
publicfunction__construct(Redis$redis,$name,$default='默認(rèn)值')
$this-redis=$redis;
$this-name=$name;
$this-default=$default;
$container=newParametersContainer();
//綁定Redis服務(wù)
$container-singleton(Redis::class,function(){
returnnewRedis();
//構(gòu)建Cache類
$cache=$container-make(Cache::class,['name'='test']);
var_dump($cache);
提示:實(shí)際上,Laravel容器的build方法并沒有第二個(gè)參數(shù)$parameters,它是用類屬性來維護(hù)自定義參數(shù)。原理都是一樣的,只是實(shí)現(xiàn)方式不一樣。這里為了方便理解,不引入過多概念。
7.服務(wù)別名
別名可以理解成小名、外號。服務(wù)別名就是給已綁定的服務(wù)設(shè)置一些外號,使我們通過外號也能找到該服務(wù)。
這個(gè)就比較簡單了,我們增加一個(gè)新的數(shù)組$aliases,用來存儲別名。再增加一個(gè)方法alias,用來讓外部注冊別名。
唯一需要我們修改的地方,就是在make時(shí),要先從$aliases中找到真實(shí)的服務(wù)名。
classAliasContainerextendsParametersContainer
//服務(wù)別名
protected$aliases=[];
//給服務(wù)綁定一個(gè)別名
publicfunctionalias($alias,$name)
$this-aliases[$alias]=$name;
//獲取服務(wù)
publicfunctionmake($name,array$parameters=[])
//先用別名查找真實(shí)服務(wù)名
$name=isset($this-aliases[$name])$this-aliases[$name]:$name;
returnparent::make($name,$parameters);
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
$container=newAliasContainer();
//綁定服務(wù)
$container-instance('text','這是一個(gè)字符串');
//給服務(wù)注冊別名
$container-alias('string','text');
$container-alias('content','text');
var_dump($container-make('string'));
var_dump($container-make('content'));
8.擴(kuò)展綁定
有時(shí)候我們需要給已綁定的服務(wù)做一個(gè)包裝,這時(shí)候就用到擴(kuò)展綁定了。我們先看一個(gè)實(shí)際的用法,理解它的作用后,才看它是如何實(shí)現(xiàn)的。
//綁定日志服務(wù)
$container-singleton('log',newLog());
//對已綁定的服務(wù)再次包裝
$container-extend('log',function(Log$log){
//返回了一個(gè)新服務(wù)
returnnewRedisLog($log);
現(xiàn)在我們看它是如何實(shí)現(xiàn)的。增加一個(gè)$extenders數(shù)組,用來存放擴(kuò)展器。再增加一個(gè)extend方法,用來注冊擴(kuò)展器。
然后在make方法返回$instance之前,按順序依次調(diào)用之前注冊的擴(kuò)展器。
classExtendContainerextendsAliasContainer
//存放擴(kuò)展器的數(shù)組
protected$extenders=[];
//給服務(wù)綁定擴(kuò)展器
publicfunctionextend($name,$extender)
if(isset($this-instances[$name])){
//已經(jīng)實(shí)例化的服務(wù),直接調(diào)用擴(kuò)展器
$this-instances[$name]=$extender($this-instances[$name]);
}else{
$this-extenders[$name][]=$extender;
//獲取服務(wù)
publicfunctionmake($name,array$parameters=[])
$instance=parent::make($name,$parameters);
if(isset($this-extenders[$name])){
//調(diào)用擴(kuò)展器
foreach($this-extenders[$name]as$extender){
$instance=$extender($instance);
return$instance;
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
classRedis
public$name;
publicfunction__construct($name='default')
$this-name=$name;
publicfunctionsetName($name)
$this-name=$name;
$container=newExtendContainer();
//綁定Redis服務(wù)
$container-singleton(Redis::class,function(){
returnnewRedis();
//給Redis服務(wù)綁定一個(gè)擴(kuò)展器
$container-extend(Redis::class,function(Redis$redis){
$redis-setName('擴(kuò)展器');
return$redis;
$redis=$container-make(Redis::class);
var_dump($redis-name);
9.上下文綁定
有時(shí)侯我們可能有兩個(gè)類使用同一個(gè)接口,但希望在每個(gè)類中注入不同的實(shí)現(xiàn),例如兩個(gè)控制器,分別為它們注入不同的Log服務(wù)。
classApiController
publicfunction__construct(Log$log)
classWebController
publicfunction__construct(Log$log)
最終我們要用以下方式實(shí)現(xiàn):
//當(dāng)ApiController依賴Log時(shí),給它一個(gè)RedisLog
$container-addContextualBinding('ApiController','Log',newRedisLog());
//當(dāng)WebController依賴Log時(shí),給它一個(gè)FileLog
$container-addContextualBinding('WebController','Log',newFileLog());
為了更直觀更方便更語義化的使用,我們把這個(gè)過程改成鏈?zhǔn)讲僮鳎?/p>
$container-when('ApiController')
-needs('Log')
-give(newRedisLog());
我們增加一個(gè)$context數(shù)組,用來存儲上下文。同時(shí)增加一個(gè)addContextualBinding方法,用來注冊上下文綁定。以ApiController為例,$context的真實(shí)模樣是:
$context['ApiController']['Log']=newRedisLog();
然后build方法實(shí)例化類時(shí),先從上下文中查找依賴參數(shù),就實(shí)現(xiàn)了上下文綁定。
接下來,看看鏈?zhǔn)讲僮魇侨绾螌?shí)現(xiàn)的。
首先定義一個(gè)類Context,這個(gè)類有兩個(gè)方法,needs和give。
然后在容器中,增加一個(gè)when方法,它返回一個(gè)Context對象。在Context對象的give方法中,我們已經(jīng)具備了注冊上下文所需要的所有參數(shù),所以就可以在give方法中調(diào)用addContextualBinding來注冊上下文了。
classContextContainerextendsExtendContainer
//依賴上下文
protected$context=[];
//構(gòu)建一個(gè)類,并自動注入服務(wù)
publicfunctionbuild($class,array$parameters=[])
$reflector=newReflectionClass($class);
$constructor=$reflector-getConstructor();
if(is_null($constructor)){
//沒有構(gòu)造函數(shù),直接new
returnnew$class();
$dependencies=[];
//獲取構(gòu)造函數(shù)所需的參數(shù)
foreach($constructor-getParameters()as$dependency){
if(isset($this-context[$class])isset($this-context[$class][$dependency-getName()])){
//先從上下文中查找
$dependencies[]=$this-context[$class][$dependency-getName()];
continue;
if(isset($parameters[$dependency-getName()])){
//從自定義參數(shù)中查找
$dependencies[]=$parameters[$dependency-getName()];
continue;
if(is_null($dependency-getClass())){
//參數(shù)類型不是類或接口時(shí),無法從容器中獲取依賴
if($dependency-isDefaultValueAvailable()){
//查找默認(rèn)值,如果有就使用默認(rèn)值
$dependencies[]=$dependency-getDefaultValue();
}else{
//無法提供類所依賴的參數(shù)
thrownewException('找不到依賴參數(shù):'.$dependency-getName());
}else{
//參數(shù)類型是一個(gè)類時(shí),就用make方法構(gòu)建該類
$dependencies[]=$this-make($dependency-getClass()-name);
return$reflector-newInstanceArgs($dependencies);
//綁定上下文
publicfunctionaddContextualBinding($when,$needs,$give)
$this-context[$when][$needs]=$give;
//支持鏈?zhǔn)椒绞浇壎ㄉ舷挛?/p>
publicfunctionwhen($when)
returnnewContext($when,$this);
classContext
protected$when;
protected$needs;
protected$container;
publicfunction__construct($when,ContextContainer$container)
$this-when=$when;
$this-container=$container;
publicfunctionneeds($needs)
$this-needs=$needs;
return$this;
publicfunctiongive($give)
//調(diào)用容器綁定依賴上下文
$this-container-addContextualBinding($this-when,$this-needs,$give);
//-----------↓↓↓↓示例代碼↓↓↓↓-----------//
classDog
public$name;
publicfunction__construct($name)
$this-name=$name;
classCat
public$name;
publicfunction__construct($name)
$this-name=$name;
$container=newContextContainer();
//給Dog類設(shè)置上下文綁定
$container-when(Dog::class)
-needs('name')
-give('小狗');
//給Cat類設(shè)置上下文綁定
$container-when(Cat::class)
-needs('name')
-give('小貓');
$dog=$container-make(Dog::class);
$cat=$container-make(Cat::class);
var_dump('Dog:'.$dog-name);
var_dump('Cat:'.$cat-name);
10.完整代碼
classContainer
//已綁定的服務(wù)
protected$instances=[];
//已綁定的回調(diào)函數(shù)
protected$bindings=[];
//服務(wù)別名
protected$aliases=[];
//存放擴(kuò)展器的數(shù)組
protected$extenders=[];
//依賴上下文
protected$context=[];
//綁定服務(wù)實(shí)例
publicfunctioninstance($name,$instance)
$this-instances[$name]=$instance;
//綁定服務(wù)
publicfunctionbind($name,$instance,$shared=false)
if($instanceinstanceofClosure){
//如果$instance是一個(gè)回調(diào)函數(shù),就綁定到bindings。
$this-bindings[$name]=[
'callback'=$instance,
//標(biāo)記是否單例
'shared'=$shared
}else{
//調(diào)用make方法,創(chuàng)建實(shí)例
$this-instances[$name]=$this-make($name);
//綁定一個(gè)單例
publicfunctionsingleton($name,$instance)
$this-bind($name,$instance,true);
//給服務(wù)綁定一個(gè)別名
publicfunctionalias($alias,$name)
$this-aliases[$alias]=$name;
//給服務(wù)綁定擴(kuò)展器
publicfunctionextend($name,$extender)
if(isset($this-instances[$name])){
//已經(jīng)實(shí)例化的服務(wù),直接調(diào)用擴(kuò)展器
$this-instances[$name]=$extender($this-instances[$name]);
}else{
$this-extenders[$name][]=$extender;
//獲取服務(wù)
publicfunctionmake($name,array$parameters=[])
//先用別名查找真實(shí)服務(wù)名
$name=isset($this-aliases[$name])$this-aliases[$name]:$name;
if(isset($this-instances[$name])){
return$this-instances[$name];
if(isset($this-bindings[$name])){
//執(zhí)行回調(diào)函數(shù)并返回
$instance=call_user_func($this-bindings[$name]['callback']);
if($this-bindings[$name]['shared']){
//標(biāo)記為單例時(shí),存儲到服務(wù)中
$this-instances[$name]=$instance;
}else{
//使用build方法構(gòu)建此類
$instance=$this-build($name,$parameters);
if(isset($this-extenders[$name])){
//調(diào)用擴(kuò)展器
foreach($this-extenders[$name]as$extender){
$instance=$extender($instance);
return$instance;
//構(gòu)建一個(gè)類,并自動注入服務(wù)
publ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主管護(hù)師考試優(yōu)劣勢分析與試題及答案
- 學(xué)員分享的執(zhí)業(yè)藥師試題及答案
- 與文化相伴的行政管理試題及答案
- 行政管理與文化活動試題及答案
- 行政決策中的多方利益協(xié)調(diào)的試題及答案
- 臨床護(hù)理評估工具試題及答案
- 自考行政管理試題實(shí)戰(zhàn)及答案解讀
- 大學(xué)語文考試綜合能力測評試題及答案
- 2025年護(hù)士資格考試準(zhǔn)備小貼士試題及答案
- 執(zhí)業(yè)護(hù)士中的自我管理試題及答案
- 聯(lián)合經(jīng)營合同協(xié)議樣本
- 雅馬哈便攜式擴(kuò)聲系統(tǒng)STAGEPAS 600i使用說明書
- 2024年六西格瑪黃帶認(rèn)證考試練習(xí)題庫(含答案)
- 文藝學(xué)名著導(dǎo)讀學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 子女撫養(yǎng)協(xié)議合同模板
- 健康證記錄表-自動提示過期功能
- 物理與人類文明學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 地質(zhì)災(zāi)害防治工程勘察規(guī)范DB50143-2003
- 商鋪用電收費(fèi)協(xié)議書模板
- 考察提拔干部近三年個(gè)人工作總結(jié)材料
- 2024年同等學(xué)力英語考試真題及詳解
評論
0/150
提交評論