Как получить автокомплит для расширенной реализации на основе интерфейса/абстрактного класса/класса? Есть библиотека , она работает с объектом . Зависимость внедрена через инъекцию, чтобы клиенты могли писать свои реализации . Проблема в том, что автокомплит идет для указанного типа, и даже если мы написали свою реализацию с расширенным апи то мы обламываемся на автокомплит. Как это вообще решается ? 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 ?
Для того чтобы использовать автокомплит для расширенной реализации на основе интерфейса/абстрактного класса/класса, можно воспользоваться механизмом DocBlocks в PHPDoc.
Например, в вашем случае, чтобы получить автокомплит для метода charge() в классе ElectroCar, можно добавить PHPDoc комментарий к методу getMachine() в классе TaxiService:
/** * @return ElectroCar */ public function getMachine() { return $this->machine; }
Теперь, при использовании метода getMachine() в клиентском коде, автокомплит будет предлагать методы, доступные в классе ElectroCar, включая метод charge().
Надеюсь, это поможет вам решить проблему с автокомплитом для расширенной реализации в вашем проекте.
Для того чтобы использовать автокомплит для расширенной реализации на основе интерфейса/абстрактного класса/класса, можно воспользоваться механизмом DocBlocks в PHPDoc.
Например, в вашем случае, чтобы получить автокомплит для метода charge() в классе ElectroCar, можно добавить PHPDoc комментарий к методу getMachine() в классе TaxiService:
/*** @return ElectroCar
*/
public function getMachine()
{
return $this->machine;
}
Теперь, при использовании метода getMachine() в клиентском коде, автокомплит будет предлагать методы, доступные в классе ElectroCar, включая метод charge().
Надеюсь, это поможет вам решить проблему с автокомплитом для расширенной реализации в вашем проекте.