2016-05-04 2 views
0

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

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

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

Используйте псевдоним. например 'use com.example/objects/Resource as MyResource;' – LazyOne

+1

использовать "\" вместо "/" в пространствах имен ^^. –

ответ

2

При импорте данного класса вы можете использовать alias. Более подробную информацию можно найти here. Пример:

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();).