[吐槽]刚读了 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 的快速开发模式。
16151 次点击
所在节点    PHP
126 条回复
encro
2020-04-15 11:38:11 +08:00
@HiCode

小而美得框架也已经有一堆了啊。
所以没必要重复造轮子。
大框架也提供了小而美得兼容方式。

至于 PHP 发展,我有两个观点:

第一:

一门想语言发展好,主要是建立好生态。

这方面探索我们能看到的有:

1,前面我提到可以建立一个基于云原生的框架;

2,symfony 的 api 平台;

3,thinkphp 的 fastadmin ;

4,微擎的应用商店;


第二:

PHP 享受了 WEB 高速发展的红利期,
而现在虽然还没有进入衰退期,
但是 WEB 发展已经没有以前那么快了。
前文提到环境变化了,
恐龙就不能生存了,
自我改良是缓慢的,
所以不要将所有鸡蛋都放在一个篮子里面,
我们尝试 PHP 新出路同时,
不妨碍同时 go,python,java 甚至 c++等语言,
生老病死本常态,
一招鲜吃遍天的懒惰思想是行不通的。
encro
2020-04-15 11:43:05 +08:00
@nicoljiang

PHP 还是简单,快速啊。
你看我都学了用了这么多框架,
我还是个很懒的人,
经常在 v2 灌水。
就知道这些框架有多简单了。

你说的 lue,python 方向是可以做客户端之类的吗?
那些真不适合 PHP 。

我宁愿去学 C#,C++,
每个人都有适合自己的定位。
历史决定的。
HiCode
2020-04-15 11:43:57 +08:00
@encro 我很早就在准备换 lua,改用 openresty,我的业务不复杂。

其实当我们这么聊的时候,哈哈哈哈,PHP 就只是一个选择而已。
encro
2020-04-15 11:50:27 +08:00
@HiCode

openresty 很好,价值很大。
曾经尝试做 waf 。

你们网站流量居然用 openresty ?
比我现在做的流量高吧?
我怕人难招,老板嫌开发不够敏捷。
如果不是因为上面原因,我更乐意用 go 慢慢堆代码吧,毕竟新玩具比较好玩。
hantsy
2020-04-15 12:05:31 +08:00
@meshell 只是记忆中的而已,我好久没关注 PHP 了。
hantsy
2020-04-15 12:09:25 +08:00
PSR 现在很多东西都是标准化,Class Loading,HTTP Messages,Mididleware,Logging,DI 等,各标准都是有大量实现。如果你真的是熟悉 PHP 生态,完全可以不用任何框架,自己像写 ExpressJS 程序那样,用一个 App 类启动组装一下,还纠结什么优雅问题。
wwolf
2020-04-15 12:17:40 +08:00
楼主懂不懂 php 哦,业务代码在于你业务的丰富度,口口声声在吐槽框架是什么鬼。期待你写一个我们围观一下?
yahon
2020-04-15 12:17:49 +08:00
ROR 和 Django 不香了吗?
Varobjs
2020-04-15 13:13:51 +08:00
@wwolf 楼主有框架的,可以去围观 👀
shanghai1998
2020-04-15 13:46:34 +08:00
php 天下无敌
HiCode
2020-04-15 13:54:10 +08:00
@encro 小项目 H5,流量是不确定的,服务器成本预算不多,所以很难。
king888
2020-04-15 14:58:49 +08:00
语言,框架始终只是工具,花样玩出头也就那样,都是浮云,什么业务场景适合用什么就用什么,没有就自己造,没什么好争来争去,谁也说服不了谁。
jhdxr
2020-04-15 15:38:34 +08:00
@dvaknheo
> 恕我浅薄,我真不知道依赖注入,对于动态语言,除了解决 [调用方式不变,实际实现可变] 功能之外还能有什么用。
如果你之前不知道,不是你的错。但现在有人明确给你指出这个概念以后,还在用你自己设想的(没错你之前的帖子我也看了,这几个你一直在强调的字我也有印象)

> 超长字符串拼接效率高还是 ob 函数分段输出效率高?
字符串拼接效率高,有数量级上的差距。( https://3v4l.org/K7c6e

> 我所说的热修复,就是不强行去改第三方库的代码,修复出第三方库出现的功能。
> 就是要跟踪到第三方库还没解决问题,这才是折腾。
『另外你这个函数能做到的,依赖注入也都行。』
此外我觉得对于一个高级程序员,在三方库中踩坑是一个很常见的事情。。。


@HiCode
> 框架是一定要用的,这是生产力工具,以一定的性能损耗换取开发效率提高非常有意义。
> 我只是因为穷才追求高性能,我的业务都是薛定谔的“qps”,爆不爆发看策划看设计,我只负责打造一个“低成本高效率”的系统。

那么我有个疑问,像 laravel 这种被批评的,在你看来,是因为它的设计导致了性能损耗,但却没有带来开发效率的提高(设计带来的价值是负),还是尽管它带来了开发效率的提高,但是相比它带来的性能损耗,性价比太低(设计带来的价值依然是正数,但是很低)?
如果是后者,我有一个新的疑问。我们都知道在优化时一般我们应该先优化瓶颈部分。那么框架性能是否已经成为了一个瓶颈,或者说不可忽略的因素?
HiCode
2020-04-15 16:33:33 +08:00
@jhdxr

第一个疑问,“laravel 带来了开发效率的提高,但是相比它带来的性能损耗,性价比太低”——我不反对优雅,我反对的是以性能为代价的“过度”优雅,将原生 PHP 的性能降到 4%,是很恐怕的一种优雅。

第二个问题,对于我日常的项目来说,有 redis 后,php 的性能问题就变成了新瓶颈,有钱可以直接升级服务器,没钱就要想办法抠性能。

我觉得我最重要的观点就是:土豪请随意,没钱才焦虑。
JokeEnd
2020-04-15 16:43:51 +08:00
大概看了 Lz 框架一眼,可能是正统的 tp3 受害者吧

类似 App::G 这种东西,建议就别用了,跟 tp3 那年代一个函数用 ABCDE 命名那种差不多,不明所以,点进去人都懵了,一点也不清真

每次接手年代久远的 php 项目,那些代码基本不是给人看的,只能当场重写·
james122333
2020-04-15 17:50:20 +08:00
opcache fastcgi 大家都会用
主要为何要全依赖框架 有时候需要的功能只要稍微改改底层实现就可以了 而不是叠床架屋
硬拼个能够符合全部需求的
装一堆插件的 vim 启动好几秒 自己写的秒开 也是一种例子
太重的东西个人觉得不是优雅
zencoding
2020-04-15 17:50:28 +08:00
dvaknheo
2020-04-15 21:40:34 +08:00
@JokeEnd
App::G 又不是给写业务代码的用的,业务代码的人,一般只会在 Controller, Service,Model,View, 这四个目录。对应的 ControllerHelper,ServiceHelper,ModelHelper,ViewHelper 里有什么东西才值得看。 这些 Helper 的 GetExtendStaticMethodList() 有点恶心而已。

G 方法用于扩展的。 比如你要替换默认的实现。

@zencoding

奇怪,怎么不从主流程看起呢? RouteHookRewrite 这个扩展默认没加载,而且我文档都没写完啊。
如果你从代码琢磨起。 最古怪的是怎么 DuckPhp\App 初始化后跑的是 MY\Base\App 的代码。这部分需要在 init 函数里琢磨一下。

DuckPhp\Core\App use DuckPhp\Core\Kernel->init ,run 才是核心, 还有个复杂的是 DuckPhp\Core\Route 路由。

@jhdxr
字符串拼接效率高,有数量级上的差距。
谢谢,我之前没估计过。,但 View 还是基本上以 echo 方式显示的,基本没见到 heredoc 类型的。如果追求效率,看来还是把 view 文件转为 heredoc 模式的文件好,综合起来,这为方便牺牲效率,这可以接受。
jinsongzhao
2020-04-15 21:57:43 +08:00
这 Yii3 是什么来头?熟悉的 Yii 和 Yii2 原作者都不见了
dvaknheo
2020-04-15 22:48:13 +08:00
额,我自己失误了,G() 函数确实会在业务中用到。如果为了扩展性。
XService::G()->foo 和 XModel::G()->foo 这种用法经常有。
或许实践起来会有一排,改成 static function 调用 吧,就是
XService::foo(); 和 XModel::foo();

有一种情况是 XSerivce::G 这模式省不了, 没默认载入的扩展,JsonRpcExt 切换成远过程调用。这属于高级用法了,具体在相关 ref 里

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

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

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

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

© 2021 V2EX