服务容器浅解,欢迎帮忙解答 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 协议》,转载必须注明作者和本文链接
推荐文章: