Почему PhpStorm допускает нулевой тип возврата для функции, использующей yield?

#php #phpstorm

#php #phpstorm

Вопрос:

Я использовал PhpStorm для автоматического добавления возвращаемого типа в функцию ниже:

 /**
 * @return Generator|null
 */
function yieldTest(): ?Generator
{
    yield from [1, 2, 3];
}
  

Мой вопрос: Почему он добавляет null опцию рядом Generator ?

Я не вижу способа вернуть null, поэтому мне интересно, не упускаю ли я что-то из виду в том, как yield работает, или это причуда со стороны PhpStorm и от нее можно безопасно отказаться?

Обновить:

Чтобы уточнить — я спрашиваю, почему PhpStorm сгенерировал возвращаемый тип как ?Generator .

Я понимаю, что затем он был добавлен null в тег php doc @return , потому что на ? .

Обновление 2:

Вот полный код из тестового файла перед генерацией дополнительных битов:

 class yieldTestClass
{
    public function yieldTest()
    {
        yield from [1, 2, 3];
    }
}
  

И вот код после выбора «Объявить тип возвращаемого значения» из контекстного меню имени метода:

 class yieldTestClass
{
    public function yieldTest(): ?Generator
    {
        yield from [1, 2, 3];
    }
}
  

Я не уверен, является ли это встроенной функцией в IDE или из плагина, но если это плагин, я предполагаю, что это будет такhttps://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended —

Хотя в любом случае вопрос тот же.

Комментарии:

1. @AbcAeffchen если вы вызываете его напрямую, он просто продолжает возвращать полный Generator экземпляр. Если вы вставляете его в foreach или что-то еще после предварительного просмотра набора результатов, он просто автоматически перематывается. Итак, в целом мне не удалось заставить его возвращать null любым доступным мне способом.

2. Пожалуйста, предоставьте код ДО того, как были сгенерированы типы, чтобы любой мог попробовать это в локальной среде. Возможно, это делает не PhpStorm (а какой-то другой плагин, не входящий в комплект). Для этого необходим исходный пример кода (поэтому мы все проверяем одно и то же). В идеале все содержимое файла (в случае, если это зависит от какого-то другого материала).

3. Хороший отзыв, добавлен до и после для полной ясности @LazyOne

Ответ №1:

? Означает «объявление типа возвращаемого значения не является обязательным и может быть теоретически опущено». PhpStorm не выполняет динамический анализ, действительно ли вы возвращаете null или нет.

Начиная с PHP 7.1.0, возвращаемые значения могут быть помечены как обнуляемые, добавляя к имени типа вопросительный знак (?). Это означает, что функция возвращает либо указанный тип, либо NULL.

Ссылка: http://php.net/manual/en/functions.returning-values.php

Рассмотрим примеры кода:

     /**
     * @return Generator|null
     */
    function yieldTest(): ?Generator
    {
        yield from [1, 2, 3];
    }
  

     /**
     * @return Generator
     */
    function yieldTest(): Generator
    {
        yield from [1, 2, 3];
    }
  

Комментарии:

1. Спасибо за ваш ответ, но я понимаю, что подсказка о типе документа php включает null из ? за. Дело в том, что именно PhpStorm сгенерировал этот бит : ?Generator , поэтому он добавил ? , и это та часть, о которой мне интересно. Я обновлю свой вопрос на случай, если это было не совсем понятно.

2. @Bananaapple ваш вопрос был лучше, чем раньше, теперь вы как будто спрашиваете, почему php storm имеет эту настройку по умолчанию, что делает его не по теме в Stack Overflow, потому что речь идет не о программировании, а о том, как вы используете инструмент (который был бы задан у суперпользователя SE).

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

Ответ №2:

Эта проверка и предполагаемое исправление (добавленный код) предоставляются плагином Php Inspections (EA Extended).

Пожалуйста, сообщите автору плагина: https://github.com/kalessil/phpinspectionsea/issues

Комментарии:

1. Хорошо, просто для ясности — это ошибка в плагине, и действительно нет способа yield действительно придумать null здесь?

2. Я не часто использую генераторы, поэтому не могу дать вам 100%-ный ответ. Даже если вы это сделаете yield ; или что-то подобное yield from null; , это все равно будет экземпляр генератора.

3. Просто заметил, что если вы сгенерируете тег PHP doc @return с помощью PhpStorm перед генерацией возвращаемого типа с помощью плагина, вы фактически получите @return Generator без опции для null , поэтому в свете этого и всего остального, я думаю, мы ищем ошибку в плагине.