Ridzhi
@Ridzhi
На вершине пищевой цепочки

Как получить автокомплит для расширенной реализации на основе интерфейса/абстрактного класса/класса?

Есть библиотека , она работает с объектом . Зависимость внедрена через инъекцию, чтобы клиенты могли писать свои реализации . Проблема в том, что автокомплит идет для указанного типа, и даже если мы написали свою реализацию с расширенным апи то мы обламываемся на автокомплит. Как это вообще решается ?
UPD. Мы можем как угодно менять реализацию TaxiService, но когда мы выкладываем ее в opensource, то клиенты разумеется не должны менять исходники, чтобы получить свои плюшки (автокомплит для своих реализаций).
interface Machine
{
    
    public function go();
    
}

class Car implements Machine
{
    
    public function go()
    {
        // TODO: Implement go() method.
    }
    
}

class ElectroCar extends Car
{
    
    public function charge()
    {

    }
    
}

class TaxiService
{
    
    protected $machine;

    function __construct(Machine $machine)
    {
        $this->machine = $machine;
    }

    public function getMachine()
    {
        return $this->machine;
    }

}

$taxi = new TaxiService(new ElectroCar());

$taxi->getMachine()->// как получить charge ?
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
@Wol_fi
php, js, mysql, highload
Автокомплит идёт по phpdoc'у.
Если вам не подходит вариант с указанием phpdoc в самом коде, можно вынести отдельно классы\методы без реализации но задокументированные, например так:

class TaxiService {

/**
 * @var Machine
 */
    protected $machine;

    function __construct(Machine $machine)
    {
    }

/**
 * @return Machine
 */
    public function getMachine()
    {
    }
}

И просто указывать такие файлы в IDE как внешнюю библиотеку. Таким образом, например, решают проблему с автокомплитом в phalcon.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
/**
 * @var Machine|OtherInterface|OtherClass
 */
protected $machine;
Ответ написан
sergoslav_0
@sergoslav_0
PHP / Magento / Laravel
Как вариант:

$taxi = new TaxiService(new ElectroCar());

/** @var ElectroCar $taxiElectroCar */
$taxiElectroCar = $taxi->getMachine();

$taxiElectroCar->
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы