Тип PHPDoc, намекающий на перекрывающиеся типы

У меня есть класс под названием Resource но с полностью определенным именем, как com.example/objects/Resource

Если я напишу файл

use com.example/objects/Resource;

/**
* Do something
*
* @param Resource $r
*/
function myfunc( Resource $r ) {
$r->something();
}

$x = new Resource();
myfunc($x);

Тогда все работает нормально. Из-за моего use оператор PHP typehinting может обрабатывать тот факт, что я передал переменную типа com.example/objects/Resource хотя myfunc сравнивает только с Resource

Проблема в том, что PHPStorm не может справиться с этим. Я не могу использовать автозаполнение и получаю предупреждение myfunc($x) который говорит Expected Resource, got Resource и предупреждение в функции, которая говорит Method 'something' not found in the class Resource, Очевидно, PHPStorm предполагает, что я использую встроенный resource класс а не мой Resource учебный класс.

Если я изменю PHPDoc и определение функции на полное имя, тогда предыдущие предупреждения исчезнут, но я получу небольшое предупреждение, которое говорит: Unnecessary fully qualified name. Я полагаю, что одним из решений было бы использование полностью определенного имени и отключение второстепенного предупреждения, но я бы предпочел не использовать полностью определенные имена везде. Я знаю, что я сам виноват в создании класса, имя которого совпадает с именем встроенного типа, но мне интересно, есть ли способ заставить эту работу работать? Помимо переименования моего Resource учебный класс?

0

Решение

Вы можете использовать alias при импорте класса. Больше информации можно найти Вот. Пример:

use com.example\objects\Resource as MyResource;

/**
* Do something
*
* @param MyResource $r
*/
function myfunc( MyResource $r ) {
$r->something();
}

$x = new MyResource();
myfunc($x);

Вы также можете указать все пространство имен и имя класса, а не только имя класса. Пример:

/**
* Do something
*
* @param com.example\objects\Resource $r
*/
function myfunc( com.example\objects\Resource $r ) {
$r->something();
}

$x = new com.example\objects\Resource();
myfunc($x);

Если вы находитесь в пространстве имен и используете этот подход, обязательно используйте ведущие \ на вашем полном спецификаторе имени класса (например, $x = new \com.example\objects\Resource();).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]