2014-10-02 78 views
4

如果我實現一個類,它可以獲取注入了一些服務,我必須寫這個散裝的代碼:如何自動化phpstorm中的類的屬性生成?

<?php 
namespace Hn\AssetDbBundle\Services; 

use Psr\Log\LoggerInterface; 
use Symfony\Bundle\TwigBundle\TwigEngine; 
use Symfony\Component\HttpKernel\KernelInterface; 

/** 
* Class SomeNewService 
* @package Hn\AssetDbBundle\Services 
*/ 

class SomeNewService { 
    /** 
    * @var TwigEngine 
    */ 
    private $engine; 
    /** 
    * @var KernelInterface 
    */ 
    private $kernel; 
    /** 
    * @var LoggerInterface 
    */ 
    private $logger; 

    public function __construct(TwigEngine $engine, KernelInterface $kernel, LoggerInterface $logger) { 
     $this->engine = $engine; 
     $this->kernel = $kernel; 
     $this->logger = $logger; 
    } 
} 

這似乎是多餘的。有沒有一種方法可以減少我必須編寫的代碼量?是否有用於初始化字段的實時模板,或者是否可以自動生成此塊的批量?

回答

15

您可以使用Initialize field功能。

這樣,你只需要編寫構造函數方法是這樣的:

class SomeNewService { 
    public function __construct(TwigEngine $engine, KernelInterface $kernel, LoggerInterface $logger) {   
    } 
} 

然後你可以使用初始化的字段。將光標放在構造函數的一個屬性上,然後在MacOS上使用Alt + Enter

它看起來是這樣的:

Initalize fields feature

按ENTER鍵後,你所面臨的性能,您可以通過和箭頭鍵選擇列表。通過選擇所有屬性,您的代碼將是這樣的:

class SomeNewService { 
    /** 
    * @var TwigEngine 
    */ 
    private $engine; 
    /** 
    * @var KernelInterface 
    */ 
    private $kernel; 
    /** 
    * @var LoggerInterface 
    */ 
    private $logger; 

    /** 
    * @param TwigEngine $engine 
    * @param KernelInterface $kernel 
    * @param LoggerInterface $logger 
    */ 
    public function __construct(TwigEngine $engine, KernelInterface $kernel, LoggerInterface $logger) { 
     $this->engine = $engine; 
     $this->kernel = $kernel; 
     $this->logger = $logger; 
    } 
} 
+4

是否沒有辦法將字段初始化爲受保護或公共? – hackel 2015-06-16 23:55:56

+0

@hackel我一直在尋找一種方法來讓它們默認保護。一般來說,「公共」和「私人」都被認爲是不好的做法。儘管如此,還沒有找到解決方案。 – Maurice 2015-08-26 14:39:37

+2

@Murice從私人被認爲是不好的做法。 使用public和protected是不好的做法,因爲你不封裝你的屬性。 在開源時你會發現保護非常糟糕。人們將以未創建的方式使用這些屬性。 受保護的應該只用於真正需要和公開從未。 – Dariss 2016-05-26 06:19:54

2

你也可以做其他方式,首先定義的屬性,然後在「生成」菜單按(Cmd + N),用「構造函數」。