個人贊成有的博文把容器 簡單理解成一個陣列(key=>value);
下面附別人博文的程式碼加個人理解,
程式碼轉載https://www.php.cn/php-weizijiaocheng-4060...
<?php
/**
* 為了約束我們先定義一個訊息介面
* Interface Message
*/
interface Message{
public function seed();
}
/**
* 有一個傳送郵件的類
* Class SeedEmail
*/
class SeedEmail implements Message
{
public function seed()
{
return 'seed email';
// TODO: Implement seed() method.
}
}
/**
*新增一個傳送簡訊的類
* Class SeedSMS
*/
class SeedSMS implements Message
{
public function seed()
{
return 'seed sms';
// TODO: Implement seed() method.
}
}
/**
* 這是一個簡單的服務容器 上面的很簡單不解釋 下面是核心
* Class Container
*/
class Container
{
protected $binds;//這個就是容器的陣列之一 我理解這個是匿名函式的陣列
protected $instances;//這個就是容器的陣列之二 我理解這個是例項的陣列
public function bind($abstract, $concrete)
{
if ($concrete instanceof Closure) {
//繫結的時候如果繫結的類是一個匿名類 就使用binds[]陣列
$this->binds[$abstract] = $concrete;
} else {
//繫結的時候如果繫結的類是一個例項物件 就使用instances[]陣列
$this->instances[$abstract] = $concrete;
}
}
//需要使用的時候 $abstract這個引數就是 陣列中的鍵
public function make($abstract, $parameters = [])
{
if (isset($this->instances[$abstract])) {
//如果繫結的時候是例項物件就會進入這裡
return $this->instances[$abstract];
}
array_unshift($parameters, $this);
echo "<pre>";//可以忽略這個是跟蹤 方便顯示
//這裡面最愁人了,全部顯示的是Closure Object
print_r($this->binds[$abstract]);
echo "<pre>";//可以忽略這個是跟蹤 方便顯示
//如果有大神看到這裡 能幫忙解釋下嗎 這裡call_user_func_array為啥能返回匿名類的物件?它怎麼和鍵對應的呢? 這個函式的用法哪裡有詳細的參考?幫助文件已經看了
return call_user_func_array($this->binds[$abstract], $parameters);
}
}
//建立一個訊息工廠
$message = new Container();
//將傳送簡訊註冊繫結到工廠裡面
$message->bind('SMS',function (){
return new SeedSMS();
});
//$a = new SeedSMS();
//$message->bind('SMS',$a);
//將傳送郵件註冊繫結到工廠
$message->bind('EMAIL',function (){
return new SeedEmail();
});
//需要傳送簡訊的時候
$SMS = $message->make('EMAIL');
echo $SMS->seed();
本作品採用《CC 協議》,轉載必須註明作者和本文連結