Тип PhpStorm - намек на заводы? - программирование

Тип 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? Я предполагаю, что ответа нет.

4b9b3361

Ответ 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 за ссылку.