Laravel 服务容器的优势是什么?

2017-06-30 10:57:48 +08:00
 PHPNewbie

刚入门 Laravel 服务容器。Laravel 的服务容器,对象的实例化由以下这种方式完成:

$obj1 = $container->make('class1', 'class2');
$obj2 = $container->make('class3', 'class4');

而以下这种方式的实例化同样可以做到:

$obj1 = new class1(new class2());
$obj2 = new class3(new class4());

那服务容器的优势到底是什么呢? 希望大佬能够用具体例子来体现或是解释一下服务容器的优势,小的多谢了。

6275 次点击
所在节点    PHP
24 条回复
Moker
2017-06-30 11:17:03 +08:00
可以去看下 依赖注入和控制反转
assad
2017-06-30 11:21:42 +08:00
竟玩一些花活,框架性能烂的要死!
mooncakejs
2017-06-30 11:25:22 +08:00
优势就是 1 楼说的。 说大白话一点就是 依赖接口而不是依赖实例。 不过 php 玩这个确实有点自宫的感觉。
zhengwenk
2017-06-30 11:28:35 +08:00
其实就是所谓的依赖注入 DI 和 控制反转 IOC。
Ouyangan
2017-06-30 11:47:22 +08:00
我写 java 后端, 容器简单理解就是:不要你自己管理对象的生命周期 ,创建,销毁都交给容器来管理 . 要用的时候注入对象就好了 , 有利于代码解耦和测试 , 这个设计思想仁者见仁智者见智.
底层数据结构一般是线程安全的哈希表 .
asen477
2017-06-30 12:00:00 +08:00
浪费资源开销。。概念机的炒作
有好有坏
random2333
2017-06-30 13:33:32 +08:00
@assad laravel 的性能测试烂,和配置优化还有默认开启 session 有关系,真实性能不算差的
abcbuzhiming
2017-06-30 14:16:14 +08:00
laravel 的那套东西,如果玩过 java 的 SSH 系列的都知道是咋回事,我个人不看好,更像是“为了证明我能这样”而搞出来的产物,而且 java 系的 web 最近一直在瘦身,往轻量化方向转,那种层层包装的做法被认为落后于时代,laravel 却觉得那样很好,还要学过来。。。我实在不觉得这有什么好学的,真正 javaee 的优点在于常驻内存,这个角度上,swoole 这样的东西才是未来,laravel 还是没脱离一次请求——载入资源——处理完毕——资源卸载这种 CGI 过程,包装的再华丽有啥用
abcbuzhiming
2017-06-30 14:17:39 +08:00
@random2333 在大部分已知 PHP MVC 框架里,他最差,这还不算差是啥,其实差点倒也无所谓,关键是我觉得这家伙路走歪了
onion83
2017-06-30 14:20:13 +08:00
@abcbuzhiming 一个写页面应用,一个写底层服务,使用场景不一样,没必要吹毛求疵吧。
sagaxu
2017-06-30 14:24:50 +08:00
我现在离了容器都不会写代码了
random2333
2017-06-30 14:25:00 +08:00
@abcbuzhiming 同意过于层层包装过于复杂,用了太多的魔术方法和闭包。性能在开启 opcache 和执行优化的指令之后没有比其他框架差的
levn
2017-06-30 14:56:45 +08:00
……也算一种“元编程”了
qiyon
2017-06-30 16:45:20 +08:00
```
$log = $container->make('log')
```

并不需要知道 log 具体是什么类,可能是`/Log/DbLog`, 可能是`/Log/FileLog`
linoder
2017-07-01 01:34:40 +08:00
代码迭代速度很高 同时还得保证单元测试覆盖率 这种情况下你说说的“服务容器”优势会非常明显
xiaotianhu
2017-07-01 09:59:31 +08:00
随便可以替换掉框架种的某个类的实现

比如我想改造一下系统里的 mysql 类 不用去动框架的代码

随便找个文件夹写好 注册到容器里就替换了。不耽误升级
abcbuzhiming
2017-07-02 22:44:25 +08:00
@onion83 不,你没明白我说的意思,和他们的应用方向无关,而是常驻内存这个关键。近年来 CGI 模式以请求——脚本载入——执行完毕——卸载的方式,受到了 jit 等模式的挑战,javaee 重新开始回暖某种程度上可以视为业界的一种态度,swoole 从设计上是常驻内存的,而 php7 虽然有了围绕 opcache 设计的 jit,但是这玩意在 CGI 模式下真是常驻内存的吗,我鲜有看到这方面的描述。
abcbuzhiming
2017-07-02 22:45:39 +08:00
@random2333 有证据吗?网上评测速度慢的证据很多,开了 opcache 和优化后速度上来的证据好像没找到
random2333
2017-07-02 23:03:27 +08:00
http://www.golaravel.com/post/benchmarking-laravel-symfony-zend/ 可以看下这个,然后测试一下和原生 php 的差距 @abcbuzhiming
z5864703
2017-07-03 11:14:25 +08:00
@abcbuzhiming 常驻内存的话,就得对资源使用精打细算了,php 快速开发有一个优势就是大部分场景不用考虑垃圾回收
Laravel 的优势就是可以快速搭建一套网站,swoole 写整套网站要疯。
使用场景都不一样
麻烦深入了解和理解下各个语言与框架,以及运行机制吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/372106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX