如何在 PhpStorm 使用 Code Completion?
PHP 進入了物件導向與 framework 時代之後,出現了大量的 namespace、class、interface 與 method,基本上這些東西已經很難用記憶的方式來寫程式,必須靠工具輔助。PhpStorm 的 Code Completion 幫我們處理了大部分的東西,讓我們只要用選的就可以開發程式,一來開發速度變快,二來也可以減少 typo,是 modern PHP 的關鍵。
Version
PHP 7.0.8
Laravel 5.2.41
PhpStorm 2016.2
Basic Code Completion
當任何地方需要使用 Code Completion 時,就可以按熱鍵 ⌃ + ␣。
如 constructor 要依賴注入時,不知道要注入的 class 名稱,可以按熱鍵 ⌃ + ␣,Code Completion 會列出目前 scope 可用的 class 名稱讓你挑選。
Smart Type Code Completion
當任何地方需要使用 Code Completion 時,且希望 Code Completion 能根據型別自動選擇適當的變數,就可以按熱鍵 ⌃ + ⇧ + ␣。
如 getTitle()
需要輸入變數時,不知道要輸入的變數名稱,可以按熱鍵 ⌃ + ⇧ + ␣,Smart Type Code Completion 會根據 getType()
的 scalar type hint 或 PHPDoc 的 @param
列出目前 scope 最適合的變數讓你挑選。
Class
一般我們都會取將物件變數名稱以 class 名稱的 camelCase 命名,當 new
時,Code Completion 會自動依照變數名稱抓到 class 名稱讓你選擇。
Field
- 若是一般 class,Code Completion 可以直接抓到 public field。
- 若是 model,則必須透過 IDE Helper 幫 model 加上 PHPDoc 註解,Code Completion 才能抓到。1 1關於 IDE Helper 的安裝與執行,詳細請參考如何在 PhpStorm 活用 PHPDoc?
Method
PhpStorm 2016.2 之前的 Code Completion,讓你選擇可以選擇 method,並提供參數資訊,老實說這樣已經很好用了。
PhpStorm 2016.2 對於參數的 Code Completion 做了更強的支援,不過預設並沒有啟動。
PhpStorm -> Preferences -> Editor -> General -> Smart Keys
- 將
Enable smart function parameters completion
打勾。
以後選擇 method 後,PhpStorm 還會幫你將原 method 的參數名稱複製過來,讓你可以更清楚要填什麼參數。
除此之外,若你使用的 PHP 7 的 type hint,或使用 PHPDoc 的 @param
描述參數型別,PhpStorm 會自動將相同型別的參數列在前面讓你挑選。
按 enter 選擇了變數後,PhpStorm 會自動跳到下一個參數,也讓你用選的。
Collection
Collection 並非 PHP 原生型別,是由 Laravel 所擴充,由於其實踐了 ArrayAccess
、 Countable
與 IteratorAggregate
interface,因此 Collection
使用起來很像 array,若要描述 Collection
元素的型別,可搭配 PHPDoc。
PostRepository.php2 2GitHub Commit : PostRepository 新增 getAllPosts()
getAllPosts()
回傳的是 Collection
型別,若由 PhpStorm 的熱鍵 ⌥ + ↩,只會有 @return Collection
,如此 foreach
時將無法顯示其元素的 field 與 method,必須加上 |Post[]
,表示回傳值除了是 Collection
外,也是 Post
型別的 array。
PostService.php3 3GitHub Commit : PostService 新增 showAllPosts()
如此在 foreach
時,就可以顯示 $post
的屬性 title
。
Service Container
PostServiceUnitTest.php4 4GitHub Commit : PostServiceUnitTest 使用 app::make()
使用 App::make()
或 app()
透過 service container 建立物件時,PhpStorm 也可以抓到該物件的 method。
Controller
routes.php
在 routes.php
的 uses
,可以抓到 controller 與其 method。
Route
index.blade.php6 6GitHub Commit : Blade 有 route 別名
Blade 的 route()
可以抓到 routes.php
所定義的 route 別名。
View
PostController.php7 7GitHub Commit : view() 可抓到 view
在 controller 內的 return view()
可以抓到 view 的名稱。
config::get()
PostController.php8 8GitHub Commit : Config::get() 可抓到設定
Config::get()
可以抓到 array 的 key 值.
DIR
PostServiceUnitTest.php9 9GitHub Commit : DIR 可抓到目前目錄的檔案
__DIR__
可抓到目前目錄的檔案,這在寫測試時特別好用,可以將測試案例檔案(如 Excel 檔)放在目前單元測試下,__DIR
會抓到 Excel 檔。
Conclusion
- 寫程式重點不是在記憶力,而是在抽象化思考,Code Completion 讓我們從 namespace、class 與 method 解放,將注意力放在解決需求上。
Sample Code
完整的範例可以在我的 GitHub 上找到。
Reference
Gary Hockin, PhpStorm Code Completion in PhpStorm 2016.2
PhpStorm Online Help, Auto-Completing Code