【问题标题】:How to automate property generation for a class in phpstorm?如何在 phpstorm 中为类自动生成属性?
【发布时间】:2014-11-27 17:30:17
【问题描述】:

如果我实现一个类,它会注入一些服务,我必须编写大量代码:

<?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;
    }
}

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

【问题讨论】:

    标签: php phpstorm auto-generate


    【解决方案1】:

    在 Windows 上: 将光标放在构造方法的参数上, 然后按 Alt + Enter ,悬停/选择初始化字段,然后按 Alt + Enter ,然后选择字段并按 Ok 。

    享受

    【讨论】:

      【解决方案2】:

      您也可以反过来,先定义属性,然后在“生成”菜单 (Cmd+N) 中,使用“构造函数”。

      【讨论】:

      【解决方案3】:

      您可以使用Initialize field 功能。

      这样,你只需要这样写构造方法:

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

      然后您可以使用初始化字段。将光标移到构造函数的一个属性上,然后在 MacOS 上使用 Alt + 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;
          }
      }
      

      【讨论】:

      • 有没有办法将字段初始化为受保护或公开?
      • @hackel 我一直在寻找一种方法来让它们也被默认保护。一般来说publicprivate 都被认为是不好的做法。不过还没有找到解决办法。
      • @Maurice 从私有被认为是不好的做法开始。使用 public 和 protected 是不好的做法,因为你没有封装你的属性。在做开源的时候你会发现protected 真的很糟糕。人们会以未创建的方式使用这些属性。受保护的应该只在真正需要的时候使用,从不公开。
      • 同意。在 95% 的情况下,您应该将所有内容保密。你使用你的方法从你的对象中获取东西。您通常只使用构造函数将东西放入对象中。这样想,你就会走得更远。
      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多