企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
https://www.php.net/manual/zh/functions.anonymous.php Laravel中的IoC服务容器中,大量使用了闭包能力,我们模拟一个便于大家理解。当然,更好的方案是自己去翻翻Laravel的源码。 ~~~html class B {} class C {} class D {} class Ioc { public $objs = []; public $containers = []; public function __construct() { $this->objs['b'] = function () { return new B(); }; $this->objs['c'] = function () { return new C(); }; $this->objs['d'] = function () { return new D(); }; } public function bind($name) { if (!isset($this->containers[$name])) { if (isset($this->objs[$name])) { $this->containers[$name] = $this->objs[$name](); } else { return null; } } return $this->containers[$name]; } } $ioc = new Ioc(); $bClass = $ioc->bind('b'); $cClass = $ioc->bind('c'); $dClass = $ioc->bind('d'); $eClass = $ioc->bind('e'); var_dump($bClass); // B var_dump($cClass); // C var_dump($dClass); // D var_dump($eClass); // NULL ~~~ > 总结 闭包特性经常出现的地方是事件回调类的功能中,另外就是像彩蛋中的IoC的实现。因为闭包有一个很强大的能力就是可以延迟加载。IoC的例子我们的闭包中返回的是新new出来的对象。当我们的程序运行的时候,如果没有调用$ioc->bind('b'),那么这个B对象是不会创建的,也就是说这时它还不会占用资源占用内存。而当我们需要的时候,从服务容器中拿出来的时候才利用闭包真正的去创建对象。同理,事件的回调也是一样的概念。事件发生时在我们需要处理的时候才去执行回调里面的代码。如果没有闭包的概念,那么$objs容器就这么写了: ~~~html $this->objs['b'] = new B(); $this->objs['c'] = new C(); $this->objs['d'] = new D(); ~~~ 容器在实例化的时候就把所有的类都必须实例化了。这样对于程序来说很多用不上的对象就都被创建了,带来非常大的资源浪费。 基于闭包的这种强大能力,现在闭包函数已经在Laravel、TP6等框架中无处不在了。学习无止尽,掌握原理再去学习框架往往更能事半功倍。 测试代码:[https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E8%BF%98%E4%B8%8D%E7%9F%A5%E9%81%93PHP%E6%9C%89%E9%97%AD%E5%8C%85%EF%BC%9F%E9%82%A3%E4%BD%A0%E7%9C%9FOUT%E4%BA%86.php](https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E8%BF%98%E4%B8%8D%E7%9F%A5%E9%81%93PHP%E6%9C%89%E9%97%AD%E5%8C%85%EF%BC%9F%E9%82%A3%E4%BD%A0%E7%9C%9FOUT%E4%BA%86.php) 参考文档:[https://www.php.net/manual/zh/functions.anonymous.php] (https://www.php.net/manual/zh/functions.anonymous.php) [https://www.php.net/manual/zh/functions.anonymous.php#100545] (https://www.php.net/manual/zh/functions.anonymous.php#100545) [https://www.php.net/manual/zh/functions.anonymous.php#119388] (https://www.php.net/manual/zh/functions.anonymous.php#119388)