对 PHP 的一些吐槽
March 17, 2018
最早开始写后台接口的时候,曾看到有观点认为包括 Laravel 在内的框架不适合写大型项目。随着使用框架一段时间有了一些体会,做一些总结。
app(Some\Claz::class)
方法得到所需要的对象实例。然而正是由于返回的对象可能是任何类型,在编辑器里无法获得任何的方法提示,只能查阅文档,手动输入,十分不靠谱。后来发现可以通过给变量添加注释让编辑器能够知道类型。
/** @var SomeService $service */
$service = app('some.service');
这样的办法勉强还算凑合,但非常难看,还不如像 Java 那样要求把类型直接写出来。
自己的代码可以通过注释添加类型信息,但对于框架中的代码就无能为力了。Laravel 框架的实现运用了许多__call
,__get
等魔术方法,比如常用的 Illuminate\Database\Eloquent\Model
类中将查询相关的逻辑通过魔术方法委托给 Illuminate\Database\Eloquent\Builder
类实现。这样便造成调用的方法要等到运行时才能确定,编辑器无法找到相应的方法,报一堆虚线警告,看起来实在非常令人纠结。此外要想看一下调用的方法还得在源码中查阅一番,人脑运行一遍代码,造成了不必要的思维负担。
function calculateSomething(int $input): int {}
function doStuff(User $user) {}
缺乏静态类型的一个引申的后果就是无法可靠地对代码进行重构。即使是强大的 PhpStorm,重构的功能也并不完善。比如将一个类挪动位置,类的命名空间似乎不会自动变过去。这种半截子的重构比没有也好不了太多。有几次重命名甚至莫名其妙地误伤一大片无关的代码。有了几次这样惨痛的教训很容易患上“重构恐惧症”,代码无法新陈代谢,质量每况愈下。