У меня есть класс под названием 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
учебный класс?
Вы можете использовать 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();
).
Других решений пока нет …