[吐槽]刚读了 yii3-demo, PHP 框架是怎么把 PHP (优雅的)玩死的。

2020-04-13 16:30:36 +08:00
 dvaknheo
虽然是看 yii3-demo 吐槽的,但 Laravel 等框架也适用。

业务代码里,和框架相关的代码越少才是耦合性越低啊。口口声声说解耦,但是一看代码里一堆和框架代码相关的,这能叫解耦么。

业务代码里,框架相关的代码多,意味着碰到框架相关的代码就越多

读代码,最怕的之一是:这东西怎么来的。 一两个特例马上能教人懂,多了没法马上会啊。

View 里不能做任何计算,不能 include 非 View 的代码。

Laravel 优雅的带着 PHP 优雅的 Java 化。当初 PHP 上手就干的年代,这是 PHP 的优势。

现在一堆代码,业务相关的没几行,这还是 PHP 么。

ORM 就非用不可么,Data struct 不容易理解么

有好用的文件路由不用,非得手写路由 (src/Factory/AppRouterFactory.php)
PHPer 的原则应该是 其他路由模式是文件路由的补充啊。

配置文件里一堆 use (config/web.php)

MVC 缺层都是大家的共识了, 业务逻辑层叫 Service 或 Logic 我都无所谓,但直接 Controller 里调用 ORM,以前 10k 行的 Controller 啊。 从 Controller 里把业务逻辑剥离出来,跑命令行测试不好么。

PHP 开发速度很快,运行速度也很快。 没必要为了那些优雅牺牲开发速度,运行速度。

讲真,我动力再足一点,写个同功能的 插进这些框架的 demo 中, 让大家见识一下应该用什么样的手段最符合 PHP 的快速开发模式。
16124 次点击
所在节点    PHP
126 条回复
dvaknheo
2020-04-14 21:08:08 +08:00
@hantsy slim 只是个路由映射。连 url 函数都没有。写 rest 或许会方便些。
印象深刻的是 slim 里那个正则。

同一作者写的 phpparser 不错。
dvaknheo
2020-04-14 21:33:08 +08:00
@JohnH Laravel 命名空间我也在用。
laravel 我用过,yii1 有个好产品,一直没看下去。yii2 看了一些没写,然后看看 yii3 所以由此感慨。

我的疑惑就是从现有产品部署的时候碰到的问题很难追踪然后得来的:有必要搞这么复杂么。
这么复杂解决了什么问题。 非得要写在框架里么,不做在框架里,作为其他库显式调用,不行吗。

当初各项目都赶时髦用 Smarty 。我就有这个问题:解决了什么问题? 模板还是要程序员来写。
HiCode
2020-04-14 21:41:33 +08:00
@JohnH 问题不在于思想属于什么阶段,而在于目前 PHP 是否有必须要以性能为代价去实现这些所谓的优雅?
hantsy
2020-04-14 22:04:24 +08:00
@dvaknheo 有一个 Routing 和 Middleware 就够, 看起来和 ExpressJS 差不多,其他的 PSR 都标准化,可以选择自己的需要的库用 Composer 安装就完了。
huijiewei
2020-04-14 22:20:42 +08:00
yii2 挺好用啊。关键是长期支持呀。。。Laravel 说实话,更新太快,不更吧看着新版本口水,更新吧,好多系统遗留。。。
whyiyhw
2020-04-14 22:22:17 +08:00
框架是为了多人协作的最低规范,PSR 是社区规范。没有这些基本规范,那就更谈不上,composer 标准包。我很难想象这些都没有的 PHP 会在各个类型的 Web 开发中速度特别快,怕不是你要一个人造一个生态? php 一直都像更有效率的地方发展,你说 php 被这些优雅框架玩死了,是真的是没意思。时代变了,你没变(ಡωಡ)
hantsy
2020-04-14 22:27:36 +08:00
以前玩过 Zend 下 Expressive,现在叫 Mezzio, 刚玩了一下。 @dvaknheo

现在 PSR 标准化后,太多的选择了,很多组件可以自己选择装配。

创建项目过程交互式,可以选择一些标准的实现。

Which container do you want to use for dependency injection?
[1] Aura.Di
[2] Pimple
[3] laminas-servicemanager
[4] Auryn
[5] Symfony DI Container
[6] PHP-DI
Make your selection or type a composer package name and version (laminas-servicemanager):
- Adding package laminas/laminas-servicemanager (^3.4)
- Copying config/container.php

Which router do you want to use?
[1] Aura.Router
[2] FastRoute
[3] laminas-router
Make your selection or type a composer package name and version (FastRoute):
- Adding package mezzio/mezzio-fastroute (^3.0.3)
- Whitelist package mezzio/mezzio-fastroute
- Copying config/routes.php

Which template engine do you want to use?
[1] Plates
[2] Twig
[3] laminas-view installs laminas-servicemanager
[n] None of the above
Make your selection or type a composer package name and version (n):

Which error handler do you want to use during development?
[1] Whoops
[n] None of the above
Make your selection or type a composer package name and version (Whoops):
hantsy
2020-04-14 22:32:11 +08:00
@dvaknheo 20 年我开始学 PHP 的时候,用 Smarty 我觉得是赶时髦。现在还在用 Smarty,等于回到通讯还是靠送信的方式了。用什么手机,微信,哪有手写的信件优雅。
hantsy
2020-04-14 22:32:32 +08:00
20 年前。
james122333
2020-04-14 23:17:11 +08:00
@dvaknheo

是这样没错 一个框架无法解决所有问题 当你要解决的时候 就是架构越来越糟糕的时候
我知道该怎么形容这种优雅了 是开著坦克车碾压需求带来的快感称为优雅
HiCode
2020-04-14 23:40:33 +08:00
https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune&l=zik073-f

看数据吧,优雅的代价是什么自己判断,有钱的土豪请忽略。

我们其实要讨论的不是“要不要跟随时代进步?”,进步是必须的——命名空间也好,psr 也好,我们支持好的技术,遵守好的规范。

但是进步路上有不同的方向,有不同的诉求,我觉得 PHP 当前的问题是,一味的追求优雅,追求设计模式,过度忽略性能影响——这样的氛围是否应该?是否有利于 PHP 的发展?
charlie21
2020-04-15 00:40:57 +08:00
少来了,既然是做 PHP 的都知道为了赶工期什么都做得出来
charlie21
2020-04-15 00:43:31 +08:00
谁管你规范阿,谁管你分层架构阿,若听你们的了 项目做不完了 你能负责吗?你早跑没影了
tailf
2020-04-15 01:22:01 +08:00
@ipwx 有内味了
jhdxr
2020-04-15 03:13:12 +08:00
@dvaknheo

> 严重在于 这个 $orm 不知道怎么来的,你知道他是 ORMInterface 接口
建议你去了解一下依赖注入这个概念。了解指的是:为什么要这个用(这个概念是怎么产生的)以及这个概念怎么用

> 也是我困惑的问题,为什么要 Controller 非得要 return 一些东西?初学者最容易搞不懂的就是这个。
> 一:加 cache 层,加 layout 是在外围的事情,直接 echo 也能加,显式表达 ,性能起见 。Duckphp 没去用中间件,用路由钩子的方式。
@encro 已经举了例子了,就是为了能够在不去改动 controller 代码的前提下,对响应做一定的处理。此外就是能够控制真正去输出内容的时机(特别是考虑到 header()之类的情况)
用 echo 的确不是不能做,但用 ob_xxx 系列的方法难道不是性能更糟糕么?


> 实现热修复就是靠这个函数
你对热修复怕是有什么误解。热修复是程序在运行过程中去替换部件。对于 PHP 来说,一般直接覆盖文件就完事了。另外你这个函数能做到的,依赖注入也都行。


> 我的疑惑就是从现有产品部署的时候碰到的问题很难追踪然后得来的
建议学会使用断点功能。线上环境建议多打日志。

---

最后,现在已经 2020 年了,php 也早就过了可以一个框架单打独斗的年代了。很多吐槽复杂 /没必要那么设计的,你们对于使用别人的轮子这件事情,是不是还停留在坚决抵制,或者复制粘贴的年代?
jhdxr
2020-04-15 03:23:18 +08:00
@charlie21 规范、架构之类的很多时候是为了未来考虑的。
(看到你最近发的那个主题多说一句)将挖坑的经验重复很多年,那你将来挖坑的速度比不上别人,被淘汰是必然的。
angryfish
2020-04-15 08:22:39 +08:00
看了 php 的那些框架,我何不直接用 Java?
lp7631010
2020-04-15 08:50:52 +08:00
@angryfish 你这话就像是“何不食肉”,虽然比喻可能不对,但就是那个感觉
HiCode
2020-04-15 09:25:15 +08:00
当优雅的框架 laravel,将性能降到原生 PHP 的 4%左右,我就想知道,是不是各位都是土豪(亦或各位的老板都是土豪)?

我不反对复杂、不反对设计,但我反对过度设计导致的性能低下,请看数据,不是降到 40%,而是降到 4%!!!

用 @angryfish 的话说:看了 php 的那些框架,我何不直接用 Java?

PHP 应该学设计模式,应该通过“有限度”的复杂设计来提高开发效率,帮助团队开发,但有必要加一个限制。

羡慕各位土豪!
couashi
2020-04-15 09:28:21 +08:00
用鸟哥的那一套框架是真简洁

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

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

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

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

© 2021 V2EX