#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
, поэтому в свете этого и всего остального, я думаю, мы ищем ошибку в плагине.