如何在 PhpStorm 使用 Code Generation?
實務上開發專案時,有一些程式碼會不斷的出現,這時可靠 PhpStorm 的 Code Generation 幫我們產生這些 code snippet,除此之外,我們也可以將自己的 code snippet 加入 Live Template,可加快發開速度,並減少 typo。
Version
PHP 7.0.8
Laravel 5.2.41
PhpStorm 2016.2
Namespace
Laravel 5 的 app 目錄下都遵循 PSR-4,也就是每個在 app 目錄下的 class 都要有 namespace,且 Laravel 與 package 都有自己的 namespace,實務上我們不可能記得了這麼長的 namespace,Code Generation 可以幫我們自動引入相對應的 namespace,若 namespace 名稱相同,會讓我們用選的。

return type 為 Collection,這是 Laravel 擴充的型別,輸入 Col 之後,Code Completion 會顯示 Collection,後面為其完整的 namespace。

Code Generation 自動幫我們 use 了正確的 namespace,不用我們操心。

Post 出現反白,Code Inspection 抱怨找不到 Post class。

將滑鼠游標放在反白的 Post 上,按熱鍵 ⌥ + ↩,選擇 Import class。
PostRepository.php1 1GitHub Commit : PostRepository 自動 use namespace
Code Generation 自動幫我們 use 了 model 的 namespace,不用我們操心。

實務上我們常常只會維護程式碼,但不會去維護 namespace,造成沒用到的 namespace 越來越多。
如我們將 return Post::all() 刪除後,因為沒使用到 Post,所以在 PhpStorm 的 use App\Post 會反灰警告你此 namspace 目前沒人使用。
PostRepository.php2 2GitHub Commit : PostRepository 自動刪除沒用的 namespace
按熱鍵 ⌃ + ⌥ + O,PhpStorm 會自動幫你將沒用到的 namespace 刪除。
Constructor
使用依賴注入後,必須建立 constructor 並注入相依物件,在每天的開發過程中需要不斷發生,Code Generation 可以幫我們自動完成 constructor injection。

按熱鍵 ⌃ + N,出現 Generate 選單,選擇 Constructor...。

在 constructor 參數列輸入要依賴注入的 class 名稱,輸入前幾個字母即可,Code Completion 會啟動讓你挑選 class 名稱。

Code Generation 自動幫我們 use 了 PostRepository 的 namespace。
輸入 $,Code Completion 會自動顯示建議的參數名稱,選擇你喜歡的命名方式。

Code Inspection 會出現警告,因為還沒產生 constructor 的 PHPDoc。

按熱鍵 ⌥ + ↩,選擇 Update PHPDoc Comment,由 PhpStorm 來幫我們產生 PHPDoc。

PhpStorm 自動幫我們產生 PHPDoc。

繼續按熱鍵 ⌥ + ↩,選擇 Initialize fields,由 PhpStorm 來幫我們產生其他程式碼。

選擇要由 Code Generation 要產生 field 的程式碼。
PostService.php3 3GitHub Commit : 新增 PostService
Code Generation 一氣呵成幫我們產生了 field,在 constructor 產生了指定 field 相對應的程式碼,另外也 use 相對應的 namespace。
Getter/Setter
實務上常常需要對 private field 加上 getter 與 setter,如重構的 Self Encapculate Field 也會用到,Code Generation 可以幫我們自動產生 getter 與 setter。

新建立一個 $postId field,按熱鍵 ⌥ + ↩,會出現各種 getter 與 setter 產生方式。
PostService.php4 4GitHub Commit : 支援 PHP 7 type hint 與 return type 的 getter 與 setter
若選擇 Add getter and setter,Code Generation 會幫我們自動產生支援 PHP 7 type hint 與 return type 的 getter 與 setter。
PostService.php5 5GitHub Commit : 支援 fluent setter
若選擇 Add fluent setter,Code Generation 甚至會幫我們自動產生 fluent 風格的 setter。
Implement Method
在物件導向中,實踐抽象化最重要的就是 interface,所以常常有 implement interface 的需求,Code Generation 提供兩種方式讓我們快速實作 interface。
SMSInterface.php6 6GitHub Commit : 新增 SMSInterface
定義了 SMSInterface,準備對簡訊的發送加以抽象化。

建立了 AzureSMSService,實作 SMSInterface,Code Inspection 馬上提出 尚未實作 SMSInterface 警告。

按熱鍵 ⌥ + ↩,選擇 Add method stubs。

Code Generation 會自動幫我們根據 interface 產生了 method 框架,連 PHPDoc 也會幫我們產生。

另外一種方式,按熱鍵 ⌃ + I,出現 Choose methods to implement 視窗,選擇你要 implement 的 method。
AzureSMSService.php7 7GitHub Commit : 自動實現 interface 的 method
Override Method
繼承是實現物件導向抽象化的另一種方式,當子類別可 override 父類別的 method。

AzurePostService 繼承了 PostService。

若我們想 override 父類別 PostService 的 showTitle(),可按熱鍵 ⌃ + O,出現 Choose method to override 視窗,選擇你要 override 的 method。
AzurePostService.php7 7GitHub Commit : 自動複寫 class 的 method
Code Generation 會自動幫我們根據父類別產生 method 框架,連 PHPDoc 也會幫我們產生。
Postfix Completion
很羨慕 fluent API 的好用嗎? Postfix Completion 讓我們可以類似 fluent API 的方式寫 PHP。
not

輸入 $title.not,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 ! 區塊。
par

輸入 $title.par,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 ( ) 區塊。
if

輸入 $title.if,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 if ( ) 區塊。
else

輸入 $title.else,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 if (! ) 區塊。
fe

輸入 $title.fe,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 foreach( ) 區塊。
null

輸入 $title.null,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 if ( === null) 區塊。
nn

輸入 $title.nn,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 if ( !== null) 區塊。
return

輸入 $title.return,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 return。
echo

輸入 $title.echo,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 echo $title;。
var_dump

輸入 $title.var_dump,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 var_dump()。

PhpStorm -> Preferences -> Editor -> General -> Postfix Completion
在 Preferences 設定底下,可以看到所有 PhpStorm 支援的 Postfix Completion,包含 JavaScript 與 PHP。
可惜 Postfix Completion 無法擴充,就只能用 PhpStorm 所提供的 postfix。
Live Template
除了 Postfix Completion 外,PhpStorm 另外提供 Live Template,這是可以自行擴充的。
fore

輸入 fore,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 foreach( ) 區塊。
forek

輸入 forek,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 foreach( ) 區塊,並包含 key 與 value。
thr

輸入 thr,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 throw new 區塊。
prif

輸入 prif,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 private function 區塊。
prof

輸入 prof,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 protected function 區塊。
pubf

輸入 pubf,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 public function 區塊。

PhpStorm -> Preferences -> Editor -> Live Templates
在 Preferences 設定底下,可以看到所有 PhpStorm 支援的 Live Template,還包含各種其通語言,甚至包含 Angular 2。
自訂 Live Template
你也可以自己將常用的 code snippet,存成自己的 Live Template。

如在寫單元測試時,$this->assertEquals() 常常使用,所以我們想將它存成 Live Template。
選擇你的 code snippet,Tools-> Save as Live Template。

輸入你自己的想要的縮寫,並在滑鼠游標停止處加上 $END$,將來 PhpStorm 會將游標停在此方便你輸入。

輸入 pubf,按熱鍵 ⇥。

Code Generation 會自動幫我們產生 $this->assertEquals(),並將游標放在 ( ) 中,方便你後續輸入。
Conclusion
- Post Completion 無法自行擴充,不過 Live Template 可以自行擴充。
- Post Completion 與 Live Template 有些是重複的,可視需求決定用哪一種,只要能提高開發效率即可。
- 要善用工具改善開發速度,將時間花在真正需要的地方,Code Generation 讓我們可以打更少的字, 還可以避免 typo。
Sample Code
完整的範例可以在我的 GitHub 上找到。
Reference
PhpStorm Online Help, Generating Code
PhpStorm Online Help, Using Postfix Template
PhpStorm Online Help, Live Template
如何在 PhpStorm 使用 Code Generation?的更多相关文章
- Code Generation and T4 Text Templates
Code Generation and T4 Text Templates Code Generation and T4 Text Templates
- Object constraint language for code generation from activity models
一.基本信息 标题:Object Constraint Language for Code Generation from Activity Models 时间:2018 出版源:Informatio ...
- 如何在"Visual Studio Code"中使用" Git" 进行版本控制
如何在"Visual Studio Code"中使用" Git" 进行版本控制 本来认为此类教程,肯定是满网飞了.今天首次使用VS Code的Git功能,翻遍了 ...
- 【Spark】Spark性能优化之Whole-stage code generation
一.技术背景 Spark1.x版本中执行SQL语句,使用的是一种最经典,最流行的查询求职策略,该策略主要基于 Volcano Iterator Model(火山迭代模型).一个查询会包含多个Opera ...
- Orchard Core 文档翻译 (二)代码生成模板 Code Generation Templates
Code Generation Templates 翻译原文:https://www.cnblogs.com/Qbit/p/9746457.html转载请注明出处 Orchard Core Templ ...
- Spark SQL includes a cost-based optimizer, columnar storage and code generation to make queries fast.
https://spark.apache.org/sql/ Performance & Scalability Spark SQL includes a cost-based optimize ...
- 记一次antlr错误:ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.2ANTLR
场景:重构spark 2.1版本的sql语法.因此 需要使用antlr: 前期准备:idea安装了antlr插件(antlr的4.7.2版本) 因此在maven工程中添加了antlr的依赖: < ...
- 如何在phpstorm中安装xdebug调试工具
用习惯了Visio Studio的调试工具,如果写个php用phpstorm没有调试工具,觉得还缺点什么.接下来就讲解一下如果安装xdebug,最好发现这个插件真好用! 1.下载xdebug.tar: ...
- 如何在phpstorm中查看yaf框架源码
1.到github下载yaf框架的doc 下载链接 https://github.com/elad-yosifon/php-yaf-doc/archive/master.zip 2.解压zip包 3. ...
随机推荐
- 20165235 2017-2018-2《Java程序设计》课程总结
20165235 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业一 预备作业二 预备作业三 第一周学习总结 第二周学习总结 第三周学习总结 第四周学习总结 ...
- Nginx的配置安装和使用
http://blog.csdn.net/e421083458/article/details/30086413 以后继续更新
- sql查询一个字段不同值并返回
sql SELECT COUNT(字段),分组字段,SUM(字段),SUM(字段) FROM 表 GROUP BY 分组字段 java EntityWrapper<ProjectEntity&g ...
- themeleaf引入公共页面
<div th:include="/top :: html"></div>//引用公共页面 <div th:replace="head&qu ...
- Tp-validate进阶
阶段1:基础 application/controller/v1/Banner.php <?php namespace app\api\controller\v1; use think\Cont ...
- HDU 4463 Outlets 【最小生成树】
<题目链接> 题目大意: 给你一些点的坐标,要求你将这些点全部连起来,但是必须要包含某一条特殊的边,问你连起这些点的总最短距离是多少. 解题分析: 因为一定要包含那条边,我们就记录下那条边 ...
- node.js爬取数据并定时发送HTML邮件
node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...
- linux基础权限管理
1.linux系统中的文件类型:- 一般文件 存放数据d 目录文件 存放其他文件l 链接文件 类似于windows系统中的快捷方式b 区块设备文件 可以随时读取c 字符设备文件 需要顺序读 ...
- web前端知识大纲:系列三 html篇
web前端庞大而复杂的知识体系的组成:html.css和 javascript 三.HTML 1.BOM BOM 是 Browser Object Model的缩写,即浏览器对象模型,当一个浏览器页面 ...
- Scrapy基础(十三)————ItemLoader的简单使用
ItemLoader的简单使用:目的是解决在爬虫文件中代码结构杂乱,无序,可读性差的缺点 经过之前的基础,我们可以爬取一些不用登录,没有Ajax的,等等其他的简单的爬虫回顾我们的代码,是不是有点冗长, ...