Тип PhpStorm - намек на заводы?
У меня есть код более или менее:
class Foo {
public static function factory($str) {
$class = "Foo_" . $str;
return new $class;
}
}
class Foo_Bar {
public function razzle() {
print "Foo_Bar->baz() was called";
}
}
$Obj = Foo::factory('Bar');
и я хотел бы, чтобы PhpStorm понимал, что $Obj
является объектом Foo_Bar
, так что, например, если я набираю $Obj->raz
, то для автозаполнения будет отображаться razzle()
.
Есть ли способ получить это? Чтобы сообщить PhpStorm, что функция Foo::factory($str)
возвращает объект типа Foo_$str
? Я предполагаю, что ответа нет.
Ответы
Ответ 1
Да, вы можете сделать это, если ваш factory является статическим методом. Он должен хорошо работать для примеров, которые вы предоставили.
Подробнее и некоторый базовый пример можно найти здесь: http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata
Ответ 2
Насколько я знаю, вы не можете заставить PHPStorm понять, что дает Foo, потому что он динамичен. Однако вы можете с уверенностью сказать PHPStorm, что такое переменная $Obj, поставив над ней комментарий doc следующим образом:
/** @var Foo_Bar $Obj */
$Obj = Foo::factory('Bar');
Ответ 3
Вы должны использовать метаданные phpstorm, которые работают как для динамических, так и для статических вызовов.
class Foo {
public function factory($str) {
$class = "Foo_" . $str;
return new $class();
}
}
class Foo_Bar {
public function baz() {
print "Foo_Bar->baz() was called";
}
}
$Obj = Foo->factory('Bar');
$Obj->baz();
создайте файл в корневом каталоге проекта и назовите его .phpstorm.meta.php
:
<?php
namespace PHPSTORM_META {
$STATIC_METHOD_TYPES = [
\Foo::factory('') => [
"Bar" instanceof \Foo_Bar,
],
];
}
спасибо @LazyOne за ссылку.