phpstorm генерирует сеттер с подсказкой типа

в phpstorm вы можете создать метод сеттера для членов класса по alt + вставить > сеттеры > выбор переменных для создания методов сеттера.

но даже когда phpstorm знает тип / класс переменной, он не вставляет подсказку типа в список параметров.

как заставить phpstorm генерировать сеттеры с подсказками типа,но только для типов hintable типов?

пример класс!--10-->

class CodeGenerationTest {
    /* @var DateTimeInterface */
    private $date;
    /* @var int */
    private $num;
}

желаемые сгенерированные сеттеры должны быть:

/**
 * @param DateTimeInterface $date
 */
public function setDate(DateTimeInterface $date)
{
    $this->date = $date;
}

/**
 * @param int $num
 */
public function setNum($num)
{
    $this->num = $num;
}

setNum - это правильно, но setDate генерируется отсутствие подсказки типа по параметру:

/**
 * @param DateTimeInterface $date
 */
public function setDate($date)
{
    $this->date = $date;
}

2 ответов


вам нужно изменить шаблон вашего метода PHP Setter в PhpStorm, чтобы указать подсказку типа.

откройте Настройки PhpStorm и меню" Шаблоны файлов и кодов", на вкладке" код "есть опция"метод PHP Setter". Измените его так:

#set($typeHintText = "$TYPE_HINT ")
## First we check against a blacklist of primitive and other common types used in documentation.
#set($nonTypeHintableTypes = ["", "string", "int", "mixed", "number", "void", "object", "real", "double", "float", "resource", "null", "bool", "boolean"])
#foreach($nonTypeHintableType in $nonTypeHintableTypes)
    #if ($nonTypeHintableType == $TYPE_HINT)
        #set($typeHintText = "")
    #end
#end
## Make sure the type hint actually looks like a legal php class name(permitting namespaces too) for future proofing reasons.
## This is important because PSR-5 is coming soon, and will allow documentation of types with syntax like SplStack<int>
#if (!$TYPE_HINT.matches('^((\)?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)+$'))
    #set($typeHintText = "")
#end
## Next, we check if this is using the array syntax like "MyClass[]", and type hint it as a plain array
#if ($TYPE_HINT.endsWith("[]"))
    #set($typeHintText = "array ")
#end

/**
 * @param ${TYPE_HINT} $${PARAM_NAME}
 */
public ${STATIC} function set${NAME}($typeHintText$${PARAM_NAME})
{
#if (${STATIC} == "static")
    self::$${FIELD_NAME} = $${PARAM_NAME};
#else
    $this->${FIELD_NAME} = $${PARAM_NAME};
#end
}

на самом деле, так как список примитивов php на самом деле короткий, можно определить, является ли он примитивным типом или нет.

Так:

    class CodeGenerationTest {

        /**
         * @var DateTimeInterface
         */
        private $date;

        /**
         * @var int
         */
        private $num;
    } 

будет на самом деле генерирует это:

     /**
     * @var \DateTimeInterface $date
     */
    public function setDate(\DateTimeInterface $date)
    {
        $this->date = $date;
    }

    /**
     * @var int $num
     */
    public function setNum($num)
    {
        $this->num = $num;
    }

вы можете найти справку о шаблонах переменных здесь: https://www.jetbrains.com/phpstorm/webhelp/file-template-variables.html


Я нашел решение @Pier настолько полезным, что я обновил его шаблон для создания сеттеров с обоими типами намеков и необязательный тип литья. Надеюсь, это поможет кому-то еще.

дано:

class CodeGenerationTest
{
    /**
     * @var \DateTime
     */
    private $date;

    /**
     * @var int
     */
    private $id;

    /**
     * @var string|null
     */
    private $notes;
}

будет генерировать:

/**
 * @param \DateTime $date
 */
public function setDate(\DateTime $date)
{
    $this->date = $date;
}

/**
 * @param int $id
 */
public function setId($id)
{
    $this->id = (int)$id;
}

/**
 * @param null|string $notes
 */
public function setNotes($notes)
{
    $this->notes = is_null($notes) ? null : (string)$notes;
}

вот шаблон кода для копирования / вставки в PHPStorm под: Settings > Editor > File and Code Templates > Code > PHP Setter Method

#set($typeHintText = "$TYPE_HINT ")
## First we check against a blacklist of primitive and other common types used in documentation.
#set($nonTypeHintableTypes = ["", "string", "int", "integer", "mixed", "number", "void", "object", "real", "double", "float", "resource", "null", "bool", "boolean"])
#foreach($nonTypeHintableType in $nonTypeHintableTypes)
    #if ($nonTypeHintableType == $TYPE_HINT)
        #set($typeHintText = "")
    #end
#end
## Make sure the type hint actually looks like a legal php class name(permitting namespaces too) for future proofing reasons.
## This is important because PSR-5 is coming soon, and will allow documentation of types with syntax like SplStack<int>
#if (!$TYPE_HINT.matches('^((\)?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)+$'))
    #set($typeHintText = "")
#end
## Next, we check if this is using the array syntax like "MyClass[]", and type hint it as a plain array
#if ($TYPE_HINT.endsWith("[]"))
    #set($typeHintText = "array ")
#end

## Set this or self
#set($thisOrSelf = "$this->")
#if (${STATIC} == "static")
    #set($thisOrSelf = "self::$")
#end

## Type cast incoming variable that can also be null, using the ternary operator
#set($ternaryCast = "")
#if ($TYPE_HINT.contains('null|') || $TYPE_HINT.contains('|null'))
    #set($ternaryCast = "is_null($${PARAM_NAME}) ? null : ")
#end

## Type cast incoming variable
#set($cast = " ")
#if ($TYPE_HINT.contains('string')) 
    #set($cast = "(string) ")
#elseif ($TYPE_HINT.contains('object')) 
    #set($cast = "(object) ")
#elseif ($TYPE_HINT.contains('int')) 
    #set($cast = "(int) ")
#elseif ($TYPE_HINT.contains('bool')) 
    #set($cast = "(bool) ")
#elseif ($TYPE_HINT.contains('float') || $TYPE_HINT.contains('double') || $TYPE_HINT.contains('real')) 
    #set($cast = "(float) ")
#end

/**
 * @param ${TYPE_HINT} $${PARAM_NAME}
 */
public ${STATIC} function set${NAME}($typeHintText$${PARAM_NAME})
{
    $thisOrSelf${FIELD_NAME} = $ternaryCast$cast$${PARAM_NAME};
}