服務容器淺解,歡迎幫忙解答 call_user_func_array

adong發表於2020-03-26

個人贊成有的博文把容器 簡單理解成一個陣列(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 協議》,轉載必須註明作者和本文連結
寫程式碼是一件趣事。

相關文章