前言
PHP Storm 這個開發工具,很多 phper 應該有所而爲,甚至也有不少人使用其作爲生產工具,但是很多人都沒有最大限度的使用它,本文就來總結一些優雅開發的小技巧。
開發環境
開發工具
在看這篇文章之前,我想你應該已經安裝好了 PHP Storm,如果沒有你也可以嘗試去官網下載頁面,進行下載安裝使用,關於許可,不在本文的討論範圍內,你可以使用以下方式獲取免費許可。
- 教育許可
- GitHub 活躍開發者
- Microsoft MVP
雖然有很多特殊方式可以激活,但是還是倡導使用正版軟件。
請儘量使用原版英文界面,不要安裝漢化補丁。
PHP
在此,我希望你最好能夠安裝最新的 PHP 發行版(7.3.x),進行開發和項目部署。
進入主題
看到這裏,我希望你已經準備好了上面所提到的,那麼我們就開始解決開發中的一些問題。
Material-Theme-UI
這是我的默認開發界面,使用的是內置主題,Solarized Light
,開發工具內置的主題默認只會改變代碼區域
的主題色,像項目的索引,這些地方都不會變(當然 這些都可以去手動改)。而且,默認的圖標的辨識度也不是很高。
這裏可以安裝一個主題 Material Theme UI
注意看左側,Project 處的索引,的項目圖標有了明顯的變化,這樣當我們在同一個目錄下有不同類型的文件時,就能通過圖標很快的辨識出來。
除此之外還有常見的 Model、util 、log 、public 、vendor 、config、static 、Middleware 、 Controller都會有特殊的圖標用來提高辨識度,相比默認的要好的多。
.ignore
看名字,就知道是用來創建忽略文件的,當我們創建一個新項目時,一些東西是不需要提交到版本管理庫的,比如 composer 的 vendor 目錄、node.js 的 node_modules 等等。這些目錄通常都是不需要提交道版本管理庫的,前端開發會有更多各種各樣的這時候我們就可以用這個工具來快速創建。
可以看到,我們可以通過選擇項目模板,來高效,快速準確地創建忽略文件。
而且,當我們需要手動忽略某個目錄時,也不需要手動去編輯 .gitignore 文件,只需要右鍵目錄,選擇對應的操作即可。
其他插件
.env files support
這個插件使用來支持 env 方法中提示的
PHP composer. json support
用於 composer.json 中的一些提示
根據不同框架
因爲我只用過這兩個框架相關的插件,其他的就不列舉了。
因爲 Laravel 插件安裝還是比較繁瑣的,雖然繁瑣,但是真的很強大,至於安裝,可以參考這篇文章
送給Laravel 開發者
Laravel IDE Helper 還有一個功能,很少有文章提到的,就是 模型註釋。
都知道 Laravel 是支持 ORM 的,但是,當我們直接通過對象獲取模型的某個屬性時,IDE 可能會提示你未定義的屬性,但是這並不影響使用,只是開發過程中看起來比較糟糕,就像下面這樣。
出現了異常,但是我們數據庫是有這個字段的,而對象上沒有,但是因爲我們繼承了 根模型 Model ,上有 __get() 方法,所以在 id 下面顯示了 點
來引起我們的注意,雖然這樣代碼對我們程序運行時沒有影響,但是開發看起來卻不是那麼的友好。
當我們使用模型註釋後,就會爲我們的每個模型對象自動生成如下的註釋信息。
是不是覺得很神奇,而且還幫我們把 MySQL 中的列註釋拿了過來。
再看一下,id 屬性已經不再那麼刺眼,但是這樣還有啥特效嗎?duang!
當然,試着選中 id 然後按下 Ctrl
+Q
如何快速轉到定義的位置呢?或者查看是怎麼定義的呢?
如果只是轉到定義,那麼直接按下 Ctrl
+🖱左鍵單擊
或者 Ctrl
+B
,就能轉到。
但是有的時候我們不一定需要轉到定義,只需要按下 Ctrl
+Shift
+I
,就能得到如下窗口,幫助我們快捷的看到定義。
通過上面的簡單使用,我們可以發現,這兩個快捷鍵,可以通過這個快捷鍵查詢某個方法或者對象屬性的文檔,而且,當我們查信的是 php 內置的方法或者對象時,還可以直接去php文檔庫查看相應的文檔。
類型提示
很多人可能都沒有注意到過,類型提示這個東西。比如這樣:
這是 Laravel 內置的一個集合類,用來處理數據集合,當我們 new 實例化一個 Collection
對象賦值給 $collection
時,開發工具會自動給我們去判別這個變量的類型,當我們再次調用時,就會看到開發工具會自動給我們提示這些類型。
可能這也是很多人選擇用 IDE 進行開發的原因之一,但是你可能會覺得 這沒什麼神奇的。但是你又會發現,在有些時候,這個功能並不起作用,比如匿名函數傳值,因爲在這裏上下文丟失,開發工具也不知道這是一個什麼類型的數據,沒法給你提供更多的服務,比如這樣。
明明上面數組的值是一個集合,怎麼就不能提示呢?最常見的就是 像 ThinkPHP 和 Laravel 的 where 和 關聯關係 這些需要一個匿名方法傳入一個對象時,就像下面這樣。
public function article(){
// 注意這裏的 $query 如果不聲明類型的話,我們是沒法得到 where 👇方法的提示的。
return $this->hasMany(Article::class)->where(function($query){
$query->where('open',1);
})
}
PHP 不像那些強類型語言,一個數組只能放同一個類型的值,而且,也無法從數組外部知道這個數組的值是什麼類型的,像 Java 這些強類型語言,在聲明時,編輯器就能推斷數組內值的類型,而 PHP 確無法去進行推斷,繼而無法提供類型提示。
這時候我們只需要顯示的告訴IDE,我這個變量是什麼類型的,編譯器就能很好的提供類型提示了。
是的,就只是單純的多了那一段註釋。
/** @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
這是一個接近萬能的快捷鍵,隨時隨地都可以使用它,他可以幫我們快速修復代碼中的一些問題,糾正一些拼寫等等,當在構造方法的參數位置使用這個方法時,可以快速的將參數變成類成員變量。
-
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
+F
、Ctrl
+Shift
+R
全局搜索和替換。 -
Ctrl
+Alt
+M
將代碼提取爲方法。很多時候,我們覺得一個方法中的一部分比較繁瑣,需要單獨提出去一個方法來出來,然而如果手動提取,那效率不回太高,這個快捷鍵可以快速幫我們提取出去。
-
Alt
+~
調出版本控制快捷操作。 - 。。。更多的快捷鍵就不一一介紹,有興趣的可以去看官方的介紹,很多時候,我們的常用的軟件會佔用一些快捷鍵,比如QQ,會佔用個格式化代碼(
Ctrl
+Alt
+L
),音樂軟件會佔用Ctrl
+Alt
+↑/↓/←/→。
後綴語法
後綴語法是一個有趣的應用,很多人並不知道,比如當我在寫js時,如果要打印一個表達式,往往需要去手動的打出 console.log 不是嗎,就算有代碼提示,這也是很費時間的,而後綴語法只需要在表達式後面跟上 .log
,然後按下 Tab
就等着神奇的事情發生吧。
類似的還有
- if 生成一個 if 語句
- notnul 生成一個 if !=null 語句
- var 將表達式存到變量
- 。。。
你可以在這裏找到更多的
看完了是不是感覺不夠用?不要擔心,你還可以自定義,比如這裏我們自定義一個 try
其中的 $EXPR$
就是原表達式,現在來試一下。
結束
這篇文章差點兒發不出來,因爲在 Windows 下沒有方便的 Markdown 自動上傳圖牀的工具,等文章寫完了才發現有二十多張圖都是在我本地,後來無奈,就寫了個腳本,自動分析 Markdown 裏面的圖片,將圖片上傳至 sm.ms 。然後又發現,本來是 gif
卻變成了 png
,很崩潰,最後用 ShareX
找回 gif 後才把文章發了出來。
雖然文章沒有完全指點到如何教你寫代碼,甚至其中一些地方還比較凌亂,但是也希望文章中的一些內容對你有所幫助。
磨刀不誤砍柴工,當我們熟練使用我們的開發工具後,在開發過程中,都可以事半功倍。