Тип возврата PHPDoc с расширенным шаблоном Factory

Я хочу использовать абстрактный базовый класс с общей функциональностью для расширения фабрик, что работает, но я не знаю, как точно указать тип возвращаемого значения и определить его с помощью PHPStorm.

Вот пример. Есть ли способ документировать в PHPDoc, что AppleFactory :: make () возвращает AppleInterface, а OrangeFactory :: make () возвращает OrangeInterface?

<?php
namespace App\Factories;

abstract class AbstractFactory {

/** @var array $drivers */
protected $drivers;

/**
* instantiate the driver based on the given driver identifier
* @param string $driver Driver identifier.
* @return ???
* @throws UnknownDriverException If driver string is not in list of available drivers.
*/
public function make($driver) {
$class = $this->className($driver);

if (is_null($class))
throw new UnknownDriverException($driver);

return new $class;
}

/**
* get the full class name for the driver
* @param string $driver String mapping of class.
* @return string
*/
public function className($driver) {
return isset($this->drivers[$driver]) ? $this->drivers[$driver] : null;
}

}

class AppleFactory extends AbstractFactory {

protected $drivers = [
// both implement AppleInterface
'fuji' => \App\Apples\Fuji::class,
'gala' => \App\Apples\Gala::class
];

}

class OrangeFactory extends AbstractFactory {

protected $drivers = [
// both implement OrangeInterface
'navel' => \App\Oranges\Navel::class,
'blood' => \App\Oranges\Blood::class
];

}

0

Решение

Есть ли способ, которым я могу документировать в PHPDoc, что AppleFactory::make() возвращает AppleInterface и OrangeFactory::make() возвращает OrangeInterface?

Исходя из ваших требований выше — стандарт @method должен делать работу — должен быть помещен в комментарий PHPDoc для этого класса (AppleFactory а также OrangeFactory соответственно). Что-то вроде этого:

 @method AppleInterface make($driver)

В то же время, поскольку вы передаете параметр в фабричный метод … и возвращаемый экземпляр имеет к этому сильное отношение — взгляните на поддержку расширенных метаданных в PhpStorm (специфическая функциональность IDE). Это то, что Laravel IDE Helper (например) использует для обеспечения лучшей интеграции IDE с этой платформой.

Подробнее об этом: https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]