热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在PhpStorm使用CodeGeneration?

實務上開發專案時,有一些程式碼會不斷的出現,這時可靠PhpStorm的CodeGeneration幫我們產生這些codesnippet,除此之外,我們也可以將自己的codesnipp

實務上開發專案時,有一些程式碼會不斷的出現,這時可靠 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.php1GitHub Commit : PostRepository 自動 use namespace

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

實務上我們常常只會維護程式碼,但不會去維護 namespace,造成沒用到的 namespace 越來越多。

如我們將 return Post::all() 刪除後,因為沒使用到 Post,所以在 PhpStorm 的 use App\Post 會反灰警告你此 namspace 目前沒人使用。

PostRepository.php2GitHub 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.php3GitHub 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.php4GitHub Commit : 支援 PHP 7 type hint 與 return type 的 getter 與 setter

若選擇 Add getter and setter,Code Generation 會幫我們自動產生支援 PHP 7 type hint 與 return type 的 getter 與 setter。

PostService.php5GitHub Commit : 支援 fluent setter

若選擇 Add fluent setter,Code Generation 甚至會幫我們自動產生 fluent 風格的 setter。

Implement Method


在物件導向中,實踐抽象化最重要的就是 interface,所以常常有 implement interface 的需求,Code Generation 提供兩種方式讓我們快速實作 interface。

SMSInterface.php6GitHub Commit : 新增 SMSInterface

定義了 SMSInterface,準備對簡訊的發送加以抽象化。

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

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

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

另外一種方式,按熱鍵 ⌃ + I,出現 Choose methods to implement 視窗,選擇你要 implement 的 method。

AzureSMSService.php7GitHub Commit : 自動實現 interface 的 method

Override Method


繼承是實現物件導向抽象化的另一種方式,當子類別可 override 父類別的 method。

AzurePostService 繼承了 PostService

若我們想 override 父類別 PostService 的 showTitle(),可按熱鍵 ⌃ + O,出現 Choose method to override 視窗,選擇你要 override 的 method。

AzurePostService.php7GitHub Commit : 自動複寫 class 的 method

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

 AzurePostService 去繼承 PostService 可能不是實務上使用繼承的一個好例子,這裡只是為了示範 Code Generation 的功能,實務上應該為了抽象化的多型來使用繼承,並遵守 SOLID 原則的里氏替換原則,而不是為了 code reuse 去使用繼承。

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


推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Ihaveapolynomial(generatedfromthecharacteristicpolynomialofamatrix)andIdliketosolve ... [详细]
author-avatar
一个字-刘斌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有