站长圈旗下网站:
您当前的位置:
> 让你玩转代码的编辑神器phpstorm功能详解(1)
让你玩转代码的编辑神器phpstorm功能详解(1)
phpstorm包含了webstorm的全部功能,更能够支持php代码。PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。phpstorm的好功能有很多很多,为我们快速有效地完成项目提供了很多的方便之处,下面我们就一窥它的神奇之处吧。
phpstorm包含了webstorm的全部功能,更能够支持php代码。PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。
phpstorm的好功能有很多很多,为我们快速有效地完成项目提供了很多的方便之处,下面我们就一窥它的神奇之处吧。
先从捣鼓编辑器外观让我们看着顺眼些开始吧。
1.修改整个软件的外观
打开&File&-&Settings&-&Appearance&(注意路径,这里有两个Appearance,一个是软件的外观,一个是编辑器的外观),然后在右边找到theme(主题),可以选择软件外观的不同主题。比如你想选择比较能够唬人的黑色外观就可以选择Darcula,如图;
然后点&Apply&就会弹出一个让你重启软件的按钮,重启以后就能看见修改的修改了(下同)。
下面的Override default fonts by(not recommended),意思是推翻默认字体(不推荐),虽然写着不推荐,但是我们偏喜欢逆天而行怎么样,打上勾,字体选&微软雅黑&,字号14,当然这个随你喜欢就行。
2.修改编辑器外观
打开&File&-&Settings&-&Editor&-&Appearance&里点中&Colors & Fonts&,右边会有一些已有的风格,它们是编辑器的整体风格,如图:
如果你想局部修改编辑器字体,可以点开&Colors & Fonts&前面的小标记,下面有个&Font&,点中它,右边出现一些选项,注意:这时候这些参数是不能修改的,所以第一步我们就是要先Save As...保存成自己的风格,然后取一个名字如mydefault,然后我们就可以为所欲为了,哈哈。
最好选择&Show only monosoaced fonts&,这个是等宽字体,等宽字体是方便我们写代码时可以进行列操作的。Size为14,Line spacing为1.1,当然这随你喜欢,在下面字体里选一个喜欢的字体,左边框里是available fonts可用字体,右边框里是Selected fonts已选择的字体,可用字体和已选字体可以点中间的左右三角按钮互换,已选字体可以用右边的上下三角按钮移动来调整上下位置。
3.支持z-coding功能
z-coding是一个让你写html可以事半功倍的东西,比如你在html文件里输入ul.nav&li*5&a然后按Tab键,马上能出来一大段代码,如下所示:
这只是z-coding的冰山一角,更多详情感兴趣的朋友可以找一下这方面的资料。&
4.Live Templates代码片断
A)我们先介绍一个代码片段最基本的功能,我们要实现的目标是在html文件或者php文件里打入&quan&这4个字符,就能出现站长圈的网址&http:/ /wwwquan .com&。怎么实现呢?
1).打开&File&-&Settings&,找到并点中&Live Templates&,
2).点右边的+号(7.0版本有两个选择,选择Live Templates),
3).Abbreviation是你将来要输出代码片断代码的缩写,现在输入&quan&,
4).Description是代码片断的描述,这是方便我们自己知道这段代码是什么东西,我们输入&站长圈网址&,
5).Template text是代码片断的内容,我们输入&&。
6).下面有一行红色的字很重要,No applicable contexts yet,Define是让你选你的代码片断是在哪种类型的文件里起作用的,这个一定要选择一下,没有选择时如下图绿框所示,它被分在一个user类别下面。现在我们要让它在html和php文件里起作用,所以在弹出框的html和php两个前面打勾(选择以后下面的字就不是红色的了),如图所示。
提示:Expand with是设置用什么快捷键来显示设置的代码片断,我们用默认的Tab键不改。
保存重启以后,打开一个html或者php文件测试一下吧。
B)下面介绍一个代码片断的复杂一点的用法。
假设我们是一个懂很多cms的高手,什么phpcms v9、帝国、织梦等等全部不在话下,但是每个cms都有自己的标签,除非你都一一记住,不然你就只能打开它默认模板或者手册去复制粘贴。现在我们就用phpstorm的代码片断来设置一个快捷输入的方法,举例说明如何快速输入phpcms v9的关键字标签和帝国的关键字标签。
1).打开&File&-&Settings&,找到并点中&Live Templates&,
2).点右边的+号(7.0版本有两个选择,选择Live Templates),
3).Abbreviation是你将来要输出代码片断代码的缩写,现在输入&cmskeywords&,
4).Description是代码片断的描述,这是方便我们自己知道这段代码是什么东西,我们输入&cms的关键字&,
5).Template text是代码片断的内容,这次和前面有所不同,我们要输入一个变量&$var$&,输入以后会发现右边那个本来灰色的按钮&Edit variables&变成可点状态了,如下图红框所示,等一下我们设置这个。
6).还是别忘了下面的红色字&Define&点一下,设置html和php打勾,这是因为有些cms的模板是html有的是php类型的,这个懂cms的朋友你懂的。
7)然后点开刚才已经可点的按钮&Edit variables&
可以看见&Derfault value&是默认值,我们输入&&页面关键字&&,注意这是一个字符串类型,外面要加英文的双引号,前面一个&Expression&里有很多函数,我们要介绍的是&enum()&枚举函数,我们输入&enum(&帝国关键字&,&phpcms关键字&)&,括号里是参数,参数用英文双引号括起来,参数中间用英文逗号相隔。
8)下面重复2--6步,点右边的+号,选择Live Templates,Abbreviation里输入&帝国关键字&(这个与你在枚举函数里输入的参数是一样的),Description 随便你写不写,你也可以写上&帝国关键字&,这个无所谓;Template text 里输入帝国的关键字标签&[!--pagekey--]&,&Define&点一下,设置html和php打勾
9)再重复2--6步,设置&phpcms关键字&是&{$SEO['keyword']}&
OK,见证奇迹的时刻到啦,我们来测试一下我们的成果吧。打开一个html或者php的文件,为什么?因为我们刚才设置了只在这两种类型的文件里才能用我们设置的代码片断啊。然后在需要的地方输入&cmskeywords&,按Tab键,是不是有个下拉菜单,里面的内容就是刚才在枚举函数里设置的,用上下键选择任意一个按回车,然后再按Tab,大功告成了。
每做一步都想想刚才是在哪里设置了才会出现这样的结果,试想一下,如果你懂N种cms,这样设置了你能省下多少时间,而且你要输出的代码可能很长,你都可以一下子输出,你也可以举一反三,用这个方法创造更多的奇迹。
5.配置的导入和导出
打开&File&-&Export Setting&,可以把我们辛辛苦苦配置的东西导出来。阿Q温馨小贴士:你可以修改这个配置文件的存放路径,把它放在一个如新浪微盘等等可以和网络同步的文件夹里,修改配置路径的文件在你软件的***目录下面的JetBrains\PhpStorm 7.0\bin\idea.properties,用记事本打开,复制第8行,把前面的#去掉,后面放你同步文件夹的路径,如
插件地址也可以放在你的同步文件夹,如图:
这样你在公司和家里就能比较快捷地同步使用这个配置文件了。
6.项目收藏夹
&File&-&Add to Favorites&
7.设置文件编码
&File&-&File Encoding&
8.新建本地项目
打开 &File&-&New Project&,弹出如下图的一个框:
&Project name&是项目名称,不要被&项目&这两个字吓到了,它其实就是你要放文件的一个文件夹名字,&Location& 就是你文件夹要放的路径,&Project type&是项目的类型,这也是phpstorm的一个特别功能,如果你要建的是一个空项目,可以选默认的&Empty project&,空项目里会默认有一个.idea文件夹。同时,phpstorm也为你准备好了一些其他项目,比如我们建一个&Twitter Bootstrap&,它是一款微博的先驱Twitter推出的前端框架利器,步骤如下:
然后你就会看见这个框架里已经有了很多文件,你就可以不费吹灰之力使用它们了。
9.新建远程项目
1. 打开 &Tools&-&Deployment&-&Brower Remote Host&,
2.在窗口右侧可以看见一个&Remote Host&区域,点开三个小点点的按钮,新建一个服务
3.填好你的FTP的信息,填完可以点&Test FTP Connection&测试一下连接是否成功,如图:
4.点开前面图中的&Advanced options&按钮,弹出如下对话框,勾选&Passive mode&被动模式:
5.还要点开&Mappings&,选择你下载服务器文件时缓存映射的地方&:
6.然后你就可以在右侧看见你连接的远程服务器了,点开小加号,就看可以看见你空间里的东西了:
7.当你第一次编辑某个文件的时候,可以在那个文件的名字上右键选择&Upload here&下载到本地,它会下载到你映射的地方,
8. 你编辑完成后可以在文件编辑区右键鼠标,选择&Upload to&把编辑好的文件上传到服务器,如果你嫌这样做麻烦,也可以设置一个快捷键,比如&ctrl+s&。
有人怕&ctrl+s&和本地保存有冲突,不用怕,因为phpstorm的强大之处在于它本地不需要你保存,它会自动保存,而且它还有一个本地版本库。
那我们顺便来看看这个本地版本库是个啥东西吧。打开菜单栏上&VCS&-&Local History&-&Show History&,你会看见,本地版本库不但帮你保存了最后的修改,而且你对文件做的每一步修改它都有记录,左侧栏显示的是修改时间,中间是显示的修改的地方,右侧是当前的文件样子,这样你再也不怕修改错了不能返回以前的步骤了,也再也不怕突然停电没有保存辛苦编辑的文件等等了,哇,真想三呼万岁啊。
更多详细操作,请看视频教程《》
站长圈推荐
网站建设知识在 TDD ??流程,?了第一? ?? ,一?始可能在同一? namespace 下只有一? class,但?著重?的?行,可能重?出更多的 class ? interface,?了更加的 高?聚,低耦合 ,我?可能??更相?的 class ? interface 重?到其他 namespace,?致相依的 class 也必?修改,在重? namepsace ?,PhpStorm 可以?我??相依的 class 一?修改,非常方便。
Laravel 5.2.37
我??以?典的 service + repository 模式?例,以 PostService ?理商???,以 PostRepository ?理?料???,?全部 post ?示在??上。
最後使用 PhpStorm 重? PostService ? PostRepository 。
以 TDD 方式??,因此必?先??元??。
PostServiceTest.php
1 GitHub Commit : ?元?? : 建立 PostServiceTest.php
tests/Unit/PostServiceTest.php
use App/Puse App/Services/PostSuse Illuminate/Foundation/Testing/DatabaseMclass PostServiceTest extends TestCase{
use DatabaseM
/** @test */
public function ?示所有文章()
/** arrange */
$expected = [
['title' =& 'title1', 'description' =& 'desc1', 'content' =& 'content1'],
['title' =& 'title2', 'description' =& 'desc2', 'content' =& 'content2'],
['title' =& 'title3', 'description' =& 'desc3', 'content' =& 'content3'],
collect($expected)-&each(function ($value) {
Post::create($value);
/** act */
$actual = app(PostService::class)-&displayAllPosts()-&toArray();
/** assert */
$this-&assertArraySubset($expected, $actual);
/** arrange */$expected = [
['title' =& 'title1', 'description' =& 'desc1', 'content' =& 'content1'],
['title' =& 'title2', 'description' =& 'desc2', 'content' =& 'content2'],
['title' =& 'title3', 'description' =& 'desc3', 'content' =& 'content3'],];collect($expected)-&each(function ($value) {
Post::create($value);});
由於?元??是使用 SQLite in Memory ??料?,只要??一?束,???就??放,因此每次??都要重新新增?料。
使用 Collection-&each() ? $expected 中的?料透? Post::create() 新增。
/** act */$actual = app(PostService::class)-&displayAllPosts()-&toArray();
?? PostService-&displayAllPosts() 。
2 此? PostService ? displayAllPost() 都??建立,TDD ?等待??亮 ?? ?,才去新增 PostService ? displayAllPost() 。
displayAllPosts() 回?的是 Collection ,但 PHPUnit ?法? Collection 做 assertion,必?先?成 array。
/** assert */$this-&assertArraySubset($expected, $actual);
??不能使用 assertEquals() ,因? posts table ?包含 created_at ? updated_at ???位,若使用 assertEquals() 一定失?,必?改用 assertArraySubset() 。
PostService
??跑??,?得到第 1 ? ?? ,PHPUnit 抱怨 PostService ? displayAllPosts() 尚未建立,??快?上。
PostService.php
3 GitHub Commit : 建立 PostService
app/Services/PostService.php
namespace App/Suse App/Repositories/PostRuse Illuminate/Database/Eloquent/Cclass PostService{
* @var PostRepository
private $postR
* PostService constructor.
* @param PostRepository $postRepository
public function __construct(PostRepository $postRepository)
$this-&postRepository = $postR
* @return Collection
public function displayAllPosts() : Collection
return $this-&postRepository-&getAllPosts();
/** * @var PostRepository */private $postR/** * PostService constructor. * @param PostRepository $postRepository */public function __construct(PostRepository $postRepository){
$this-&postRepository = $postR}
因? PostService ?使用到 PostRepository ,使用 constructor injection 注入 PostRepository 。
/** * @return Collection */public function displayAllPosts() : Collection{
return $this-&postRepository-&getAllPosts();}
呼叫 PostRepository 的 getAllPosts() , 回? Collection 。
4 此? PostRepository ? getAllPosts() 都??建立,TDD ?等待??亮 ?? ?,才去新增 PostRepository ? getAllPosts() 。
?什? PostService 只有呼叫 PostRepository 而已?
??上 PostService 除了呼叫 PostRepository 外,??有自己的商???要?,本文因?重?在 namespace 重? ,所以?化了 PostService ,?於 Service 模式,????考 如何使用 Service 模式?
PostRepository
??跑??,?得到第 2 ? ?? ,PHPUnit 抱怨 PostRepository ? getAllPosts() 尚未建立,??快?上。
PostRepository.php
5 GitHub Commit : 建立 PostRepository
app/Repositories/PostRepository.php
namespace App/Ruse App/Puse Illuminate/Database/Eloquent/Cclass PostRepository{
* @return Collection
public function getAllPosts() : Collection
return Post::all();
??化起?,回? post table 所有?料。
得到第 1 ? ?? ,完成 PostService ? PostRepository 。
?元??目的是?出 service ? repository,我?要???整合??,? route、controller ? view ?上。
PostApplicationTest.php
6 GitHub Commit : 整合?? : 建立 PostApplicationTest
tests/Unit/PostServiceTest.php
use App/Puse Illuminate/Foundation/Testing/DatabaseMclass PostApplicationTest extends TestCase{
use DatabaseM
/** @test */
public function ?示所有文章()
/** arrange */
$expected = [
['title' =& 'title1', 'description' =& 'desc1', 'content' =& 'content1'],
['title' =& 'title2', 'description' =& 'desc2', 'content' =& 'content2'],
['title' =& 'title3', 'description' =& 'desc3', 'content' =& 'content3'],
collect($expected)-&each(function ($value) {
Post::create($value);
/** act */
$this-&visit('/post');
/** assert */
collect($expected)-&each(function ($value) {
$this-&see($value['title']);
$this-&see($value['description']);
$this-&see($value['content']);
/** arrange */$expected = [
['title' =& 'title1', 'description' =& 'desc1', 'content' =& 'content1'],
['title' =& 'title2', 'description' =& 'desc2', 'content' =& 'content2'],
['title' =& 'title3', 'description' =& 'desc3', 'content' =& 'content3'],];collect($expected)-&each(function ($value) {
Post::create($value);});
由於?元??是使用 SQLite in Memory ??料?,只要??一?束,???就??放,因此每次??都要重新新增?料。
使用 Collection-&each() ? $expected 中的?料透? Post::create() 新增。
/** act */$this-&visit('/post');
???? /post URI。
7 此? route 都??建立,TDD ?等待??亮 ?? ?,才去新增 route。
/** assert */collect($expected)-&each(function ($value) {
$this-&see($value['title']);
$this-&see($value['description']);
$this-&see($value['content']);});
期望在??上看到 title 、 description ? content 等?料。
使用 Collection-&each() ? $expected 中的?料透? $this-&see() 做 assertion。
8 此? view 都??建立,TDD ?等待??亮 ?? ?,才去新增 view。
??跑??,?得到第 1 ? ?? ,PHPUnit 抱怨找不到 http://localhost/post ,因? route 尚未建立,??快?上。
routes.php
9 GitHub Commit : 建立 routes
app/Http/routes.php
Route::get('/', function () {
return view('welcome');});Route::get('/post', [
=& 'post',
'uses' =& ']);
新增 route /post ,?指定其 controller ?
10 此? PostController 都??建立,TDD ?等待??亮 ?? ?,才去新增 PostController 。
PostController
??跑??,?得到第 2 ? ?? ,PHPUnit 抱怨 PostController 尚未建立,??快?上。
PostController.php
11 GitHub Commit : 建立 PostController
app/Http/Controllers/PostController.php
namespace App/Http/Cuse App/Http/Ruse App/Services/PostSclass PostController extends Controller{
* Display a listing of the resource.
* @return /Illuminate/Http/Response
public function index()
$data['posts'] = app(PostService::class)-&displayAllPosts();
return view('post.index', $data);
使用 app() 建立 PostService ,?呼叫其 displayAllPosts() 。
回? post.index view。
12 此? post.index view 都??建立,TDD ?等待??亮 ?? ?,才去新增 post.index view。
Post.Index Blade
??跑??,?得到第 3 ? ?? ,PHPUnit 抱怨 post.index view 尚未建立,??快?上。
index.blade.php
13 GitHub Commit : 建立 post.index view
&!DOCTYPE html&&html&&head&
&title&Posts&/title&&/head&&body&@foreach($posts as $post)
&h2&{{ $post-&title }}&/h2&
&h2&{{ $post-&description }}&/h2&
&h2&{{ $post-&content }}&/h2&
&hr&@endforeach&/body&&/html&
??使用 @foreach ? binding ??料?示。
得到第 1 ? ?? ,完成 routes ? PostController ? post.index view。
重? PostService
到目前?止,已? ?? ?成需求,但??? PostService 放在 app/Services 下似乎不妥,想? PostServie 重?放在 app/Services/Post 目?下。
根? PSR-4 ,PHP 的 namespace 必??目?相同,也就是?除了? PostService 放到 app/Services/Post 目?下外,以下程式?必?修改 :
PostService 的 namespace 必?修改。
?元??的 PostServiceTest 的 use 必?修改。
Controller 的 PostController 的 use 必?修改。
本文只是很??的?例,已?要改 3 ?地方,??上?更??,要改的地方?更多,?可能?改到或改?。
??候就要使用 PhpStorm 的重?了。
?滑鼠游?放在要重?的 PostService 的 class 名?上,按?? ? + T,?? Move 。
?示 Move Class ??框。
在 Move Class PostService to namespace 填入新的 namespace : App/Services/Post ,PhpStorm ?自?在 Target destination directory 加上 Post 目?。
? Search in comments and strings ? Search for text occurrences 都打勾。
按下 Preview 可以先看一下 PhpStorm ?做哪些重?,按 Refactor ?直接重?。
PhpStorm ?告?? PostController 、 PostServiceTest ? PostService 做重?,?我?的?期相同。
若?? PhpStorm 失去水?判???,可以?其??按右??其 Excluded 或 Remove 掉。
最後按 Do Refactor ?始重?。
重?完?快跑?元???整合??,?? PhpStorm ?有改?。
重? PostRepository
前一?例子,是? PostService ?一 class 重?其 namespace,??上?有另外一??用,是?一?目?下所有 class 重?成另外一? namespace。
目前想? app/Repositories 下所有的 class 重?到 app/Repositories/Post 目?下。
根? PSR-4 ,PHP 的 namespace 必??目?相同,也就是?除了? PostRepository 放到 app/Repositories/Post 目?下外,以下程式?必?修改 :
PostRepository 的 namespace 必?修改。
Service 的 PostService 的 use 必?修改。
若目?下有很多 class,要改的地方?更多,?可能?改到或改?。
??候就要使用 PhpStorm 的重?了。
??要重?目?下的其中一??案??,本例 app/Repositories 目?下只有 PostRepository 。
?滑鼠游?放在要重?的 PostRepository 的 namespace 名?上,按?? ? + T,?? Move 。
?示 Move Namespace ??框。
在 New Namespace name 填入新的 namespace : App/Repositories/Post ,PhpStorm ?自?在 Target destination directory 加上 Post 目?。
? Search in comments and strings ? Search for text occurrences 都打勾。
按下 Preview 可以先看一下 PhpStorm ?做哪些重?,按 Refactor ?直接重?。
PhpStorm ?告?? PostRepository ? PostService 做重?,?我?的?期相同。
若?? PhpStorm 失去水?判???,可以?其??按右??其 Excluded 或 Remove 掉。
最後按 Do Refactor ?始重?。
重?完?快跑?元???整合??,?? PhpStorm ?有改?。
Conclusion
重??一 class,是?游?放在 class 名?上。
重?一目?下所有 class,是?游?放在 namespace 名?上。
Laravel 5 大量使用 namespace 後,只要改 namespace 就是大家永?的痛,透? PhpStorm 的重?,?自己?的?元???整合??保?後,再也不用害怕改 namespace 了。
Sample Code
完整的?例可以在我的 GitHub 上找到。
最新教程周点击榜
微信扫一扫