讓我們忘記 Namespace,Class 與 Method

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 所擴充,由於其實踐了 ArrayAccessCountableIteratorAggregate 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.phpuses,可以抓到 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

2016-07-25