如何在phpstorm中自动生成类的属性?

k0p*_*kus 6 php auto-generate 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是多余的.有没有办法可以减少我必须编写的代码量?是否有用于初始化字段的实时模板,或者我可以自动生成此块的大部分内容吗?

k0p*_*kus 22

您可以使用该Initialize field功能.

这样,您只需要以这种方式编写构造函数方法:

class SomeNewService {
    public function __construct(TwigEngine $engine, KernelInterface $kernel, LoggerInterface $logger) {        
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用初始化字段.将光标放在构造函数的一个属性上,然后在MacOS上使用Alt+ Enter.

它看起来像这样:

初始化字段功能

按Enter键后,您将面对一个属性列表,您可以通过这些属性Shift和箭头键进行选择.通过选择所有属性,您的代码将如下所示:

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法将字段初始化为受保护或公开? (4认同)
  • 私人的@Maurice被认为是不好的做法.使用public和protected是不好的做法,因为你没有封装你的属性.在开源时你会发现受保护的非常糟糕.人们将以未创建的方式使用这些属性.受保护的应该仅在真正需要时才使用,而且从不公开. (2认同)