如何使用 PHP Storm 进行优雅的项目开发?

前言

PHP Storm 这个开发工具,很多 phper 应该有所耳闻,甚至也有不少人使用其作为生产工具,但是很多人都没有最大限度的使用它,本文就来总结一些优雅开发的小技巧。

开发环境

开发工具

在看这篇文章之前,我想你应该已经安装好了 PHP Storm,如果没有你也可以尝试去官网下载页面,进行下载安装使用,关于许可,不在本文的讨论范围内,你可以使用以下方式获取免费许可。

  • 教育许可
  • GitHub 活跃开发者
  • Microsoft MVP

虽然有很多特殊方式可以激活,但是还是倡导使用正版软件。
请尽量使用原版英文界面,不要安装汉化补丁。

PHP

在此,我希望你最好能够安装最新的 PHP 发行版(7.3.x),进行开发和项目部署。

进入主题

看到这里,我希望你已经准备好了上面所提到的,那么我们就开始解决开发中的一些问题。

Material-Theme-UI

1559702160735

这是我的默认开发界面,使用的是内置主题,Solarized Light ,开发工具内置的主题默认只会改变代码区域的主题色,像项目的索引,这些地方都不会变(当然 这些都可以去手动改)。而且,默认的图标的辨识度也不是很高。
这里可以安装一个主题 Material Theme UI

1559702512614

注意看左侧,Project 处的索引,的项目图标有了明显的变化,这样当我们在同一个目录下有不同类型的文件时,就能通过图标很快的辨识出来。
除此之外还有常见的 Model、util 、log 、public 、vendor 、config、static 、Middleware 、 Controller都会有特殊的图标用来提高辨识度,相比默认的要好的多。

.ignore

看名字,就知道是用来创建忽略文件的,当我们创建一个新项目时,一些东西是不需要提交到版本管理库的,比如 composer 的 vendor 目录、node.js 的 node_modules 等等。这些目录通常都是不需要提交到版本管理库的,前端开发会有更多各种各样的这时候我们就可以用这个工具来快速创建。

1559703246536
可以看到,我们可以通过选择项目模板,来高效,快速准确地创建忽略文件。
1559703289083
而且,当我们需要手动忽略某个目录时,也不需要手动去编辑 .gitignore 文件,只需要右键目录,选择对应的操作即可。

1559703401752

其他插件

.env files support

这个插件使用来支持 env 方法中提示的

Screenshot 1

PHP composer. json support

用于 composer.json 中的一些提示
Screenshot 1
Screenshot 2

根据不同框架

因为我只用过这两个框架相关的插件,其他的就不列举了。
因为 Laravel 插件安装还是比较繁琐的,虽然繁琐,但是真的很强大,至于安装,可以参考这篇文章

送给Laravel 开发者

Laravel IDE Helper 还有一个功能,很少有文章提到的,就是 模型注释
都知道 Laravel 是支持 ORM 的,但是,当我们直接通过对象获取模型的某个属性时,IDE 可能会提示你未定义的属性,但是这并不影响使用,只是开发过程中看起来比较糟糕,就像下面这样。
1559705754938
出现了异常,但是我们数据库是有这个字段的,而对象上没有,但是因为我们继承了 根模型 Model ,上有 __get() 方法,所以在 id 下面显示了 来引起我们的注意,虽然这样代码对我们程序运行时没有影响,但是开发看起来却不是那么的友好。
当我们使用模型注释后,就会为我们的每个模型对象自动生成如下的注释信息。

1559706722391

是不是觉得很神奇,而且还帮我们把 MySQL 中的列注释拿了过来。
1559706785935
再看一下,id 属性已经不再那么刺眼,但是这样还有啥特效吗?duang!
当然,试着选中 id 然后按下 Ctrl+Q

1559706869014

如何快速转到定义的位置呢?或者查看是怎么定义的呢?

如果只是转到定义,那么直接按下 Ctrl+🖱左键单击 或者 Ctrl+B,就能转到。

但是有的时候我们不一定需要转到定义,只需要按下 Ctrl+Shift+I,就能得到如下窗口,帮助我们快捷的看到定义。

1559707065912

通过上面的简单使用,我们可以发现,这两个快捷键,可以通过这个快捷键查询某个方法或者对象属性的文档,而且,当我们查信的是 php 内置的方法或者对象时,还可以直接去php文档库查看相应的文档。

1559710027100

类型提示

很多人可能都没有注意到过,类型提示这个东西。比如这样:

1562313864706

这是 Laravel 内置的一个集合类,用来处理数据集合,当我们 new 实例化一个 Collection 对象赋值给 $collection 时,开发工具会自动给我们去判别这个变量的类型,当我们再次调用时,就会看到开发工具会自动给我们提示这些类型。

可能这也是很多人选择用 IDE 进行开发的原因之一,但是你可能会觉得 这没什么神奇的。但是你又会发现,在有些时候,这个功能并不起作用,比如匿名函数传值,因为在这里上下文丢失,开发工具也不知道这是一个什么类型的数据,没法给你提供更多的服务,比如这样。

1562316015672

明明上面数组的值是一个集合,怎么就不能提示呢?最常见的就是 像 ThinkPHP 和 Laravel 的 where 和 关联关系 这些需要一个匿名方法传入一个对象时,就像下面这样。

public function article(){
    //  注意这里的 $query 如果不声明类型的话,我们是没法得到 where 👇方法的提示的。
    return $this->hasMany(Article::class)->where(function($query){
        $query->where('open',1);
    })
}

PHP 不像那些强类型语言,一个数组只能放同一个类型的值,而且,也无法从数组外部知道这个数组的值是什么类型的,像 Java 这些强类型语言,在声明时,编辑器就能推断数组内值的类型,而 PHP 确无法去进行推断,继而无法提供类型提示。

这时候我们只需要显示的告诉IDE,我这个变量是什么类型的,编译器就能很好的提供类型提示了。

1562316449195

是的,就只是单纯的多了那一段注释。

/** @var Collection $collection */

这个注释和普通的多行注释有一点稍稍的不一样。/** 这里是由两个 ** 开头的,这表示是一个 phpdoc 块。

@var data_type $name

@var 表示这是一个变量,空格后跟上变量的类型,然后再来一个空格,跟上变量名。

这个语法还可以给类成员属性添加类型。

这样 IDE 就能很好的提示,辅助开发了,为我们提示方法,方法传参时实现了“静态检查”。

而且,不止可以这样玩。在 phpDoc 中,还有更多有趣的规则。

  • @param 给方法参数声明约束和说明
  • @return 给return 添加类型约束和说明
  • @throws 这个是用在方法上的,用来告诉 IDE ,这个方法中有异常抛出,可以声明多个。
  • ....

如果你感兴趣,还可以来 PHPDoc reference — phpDocumentor 获取更多的相关标签。

并且,phpDoc 已经在 PSR 中 fig-standards/proposed at master · phpDocumentor/fig-standards ,成为推荐标准。

但是,看到这里,我不得不说,在 PHP 7 中,对类型约束已经做得非常好了,在即将发布的 PHP 7.4 中,对类成员属性也支持了类型约束,在今后的开发中,我们可能不在需要通过注释去约束、告诉开发工具这个参数的类型什么,而且相比之下,代码也会更加规范,减少bug。

快捷键

在日常开发中,少不了快捷键的使用,快捷键可以提高我们的开发效率同时也会非常 cool,除了上面我们使用过的快捷键,下面还有一些常用的。

  • CTRL + Y
    删除当前行,当你在第一次按下它时,会提示设置这个按键的预设是 undo 还是 delete line。这里选择 delete line
  • ALT+J
    选中相同的单词。用过 Sublime Text 的应该都知道 ,当你在 Sublime Text 中 按下 Ctlr+D 时会帮你选中相同的单词,以帮助你同步修改。
  • 🖱左键+ Shift + Alt
    矩形选择。
  • Alt+Insert
    快速插入方法。当在一个类中按下这个快捷键之后,会弹出一个框让我们选择,在这里,我们可以快速准确地 覆盖/实现 父类的方法,还可以快速的对类成员生成 getter 、setter 方法、构造方法。
  • Alt + Enter
    这是一个接近万能的快捷键,随时随地都可以使用它,他可以帮我们快速修复代码中的一些问题,纠正一些拼写等等,当在构造方法的参数位置使用这个方法时,可以快速的将参数变成类成员变量。
    1562835749136
  • Shift + F6
    重构。当我们在一个上下文中需要修改一个 变量名/方法名/类名/文件名 时,这个快捷键就排上了用场,按下这个快捷键,IDE 会自动去搜索引用他的地方,同步帮你修改,这就是一个万能的改名快捷键。当然 修改类名时存在一些问题。当然 有时候也可以配合 Alt+J 来做。
  • Ctrl+Shift+Enter
    快速完成
  • Ctrl + W
    这个快捷键在很多工具上都是关闭 Tab ,然而这里不是,这里标识按单词或范围上下文扩选,当我们需要删除或者选中一些时,不再需要去小心翼翼的移动鼠标。
  • Ctrl + Shift + C
    复制当前正在编辑的文件的物理路径,当我们需要用其他编辑器打开时,这个就非常有用了。
  • Ctrl+Shift+ALT+C
    这个快捷键比上面的多了一些,配合下一个快捷键会更加好用。
    当我们在团队开发中,有时候需要分享或者定位代码时,你的同事可能会告诉你那一行代码在 xx 处xxx 行,然后你就要从左侧的导航栏去找到他。显得非常的笨拙,这个快捷键可以复制出当前文件相对于项目根路径的路径,以及行号,方便快速定位。
  • 双击 Shift
    这个快捷键非常万能,在这个搜索框里面,我们可以搜索 文件方法 甚至可以输入完整的命名空间快速定位类方法。以及上面那个快捷键复制的路径快速定位文件。
    上面那个快捷键复制出来的就像
vendor/composer/ClassLoader.php:47

这样的内容,我们 双击 Shift 粘贴进去就可以快速定位到文件并且定位到行。

  • Ctrl+Shift+FCtrl+Shift+R
    全局搜索和替换。
  • Ctrl+Alt+M
    将代码提取为方法。很多时候,我们觉得一个方法中的一部分比较繁琐,需要单独提出去一个方法来出来,然而如果手动提取,那效率不回太高,这个快捷键可以快速帮我们提取出去。
    1562837174807
  • Alt + ~
    调出版本控制快捷操作。
  • 。。。更多的快捷键就不一一介绍,有兴趣的可以去看官方的介绍,很多时候,我们的常用的软件会占用一些快捷键,比如QQ,会占用个格式化代码(Ctrl+Alt+L),音乐软件会占用 Ctrl+Alt+↑/↓/←/→。

后缀语法

后缀语法是一个有趣的应用,很多人并不知道,比如当我在写js时,如果要打印一个表达式,往往需要去手动的打出 console.log 不是吗,就算有代码提示,这也是很费时间的,而后缀语法只需要在表达式后面跟上 .log ,然后按下 Tab 就等着神奇的事情发生吧。

类似的还有

  • if 生成一个 if 语句
  • notnul 生成一个 if !=null 语句
  • var 将表达式存到变量
  • 。。。

你可以在这里找到更多的

1562837685563

看完了是不是感觉不够用?不要担心,你还可以自定义,比如这里我们自定义一个 try

1562837808270

1562837850483

其中的 $EXPR$ 就是原表达式,现在来试一下。

结束

这篇文章差点儿发不出来,因为在 Windows 下没有方便的 Markdown 自动上传图床的工具,等文章写完了才发现有二十多张图都是在我本地,后来无奈,就写了个脚本,自动分析 Markdown 里面的图片,将图片上传至 sm.ms 。然后又发现,本来是 gif 却变成了 png ,很崩溃,最后用 ShareX 找回 gif 后才把文章发了出来。

虽然文章没有完全指点到如何教你写代码,甚至其中一些地方还比较凌乱,但是也希望文章中的一些内容对你有所帮助。
磨刀不误砍柴工,当我们熟练使用我们的开发工具后,在开发过程中,都可以事半功倍。

参考资料

阅读 1.2k更新于 11月22日
推荐阅读

记录收集一些开发中遇到的奇技淫巧和坑

30 人关注
10 篇文章
专栏主页
目录