服务容器浅解,欢迎帮忙解答 call_user_func_array

个人赞成有的博文把容器 简单理解成一个数组(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 协议》,转载必须注明作者和本文链接
写代码是一件趣事。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!