array_unshift
call_user_func_array闭包

下面是学院的代码
class Container
{
protected $binds; protected $instances; public function bind($abstract, $concrete)
{
if ($concrete instanceof Closure) {
$this->binds[$abstract] = $concrete;
} else {
$this->instances[$abstract] = $concrete;
}
} public function make($abstract, $parameters = [])
{
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
} array_unshift($parameters, $this); return call_user_func_array($this->binds[$abstract], $parameters);
}
} // 创建一个容器(后面称作超级工厂)
$container = new Container; // 向该 超级工厂添加超人的生产脚本
$container->bind('superman', function($container, $moduleName) {
return new Superman($container->make($moduleName));
}); // 向该 超级工厂添加超能力模组的生产脚本
$container->bind('xpower', function($container) {
return new XPower;
}); // 同上
$container->bind('ultrabomb', function($container) {
return new UltraBomb;
}); // ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', 'xpower');
$superman_2 = $container->make('superman', 'ultrabomb');
$superman_3 = $container->make('superman', 'xpower');
// ...随意添加

最新文章

  1. window系统JDK1.7的快速配置
  2. 老猪带你玩转android自定义控件一——打造最简单viewpagerindicator
  3. 15款免费的响应式 WordPress 主题下载
  4. linux:nohup 不生成 nohup.out的方法
  5. 互斥对象 Mutex 和MFC中的CMutex
  6. Shell教程5-Shell运算符
  7. 开发流程习惯的养成—TFS简单使用
  8. Linux Add a Swap File
  9. Abp zero 3.0.1发布
  10. Mybatis入门1
  11. 逆向学习-Upack的PE文见头分析
  12. 修改Anaconda3中jupyter的工作目录
  13. 在微信小程序中,如何实现下拉刷新(模拟刷新)
  14. Span<T>和ValueTuple<T>性能是.Net Core非常关键的特性
  15. C# 多线程九之Timer类
  16. 【AtCoder】CODE FESTIVAL 2017 Final
  17. 【Java】K-means算法Java实现以及图像切割
  18. auto_ptr与shared_ptr ZZ
  19. 数据链路层 点对点协议 PPP
  20. 【CODEVS】2800 送外卖

热门文章

  1. 「CF1037D」Valid BFS?
  2. vue cli3.0打包
  3. nginx反向代理(2)
  4. 5G将重新定义物联网和边缘计算
  5. scrapy 实现mysql 数据保存
  6. IOS TableView 用法
  7. WebEx如何录制电脑内的声音
  8. 十九 Listener
  9. Ubuntu 移植 ffmpeg + x264
  10. 面试题之xml解析?