автокомплит и грамотный код

SergXP

Новичок
Всем привет!

Вроде бы банальная задача, а не могу заставить работать)

Имеем примерно такую структуру классов:
PHP:
interface IAdapter
{
    public function getAdapter();
}

abstract class AAdapter
{
    /**
    * @return MySQL|PostgreSQL
    */
    public function getAdapter()
    {
        return $this;
    }
}

class MySQL extends AAdapter implements IAdapter
{
    /**
    * @return string
    */
    public function thisMysql()
    {
        return "This is Mysql";
    }
}

class PostgreSQL extends AAdapter implements IAdapter
{
    /**
    * @return string
    */
    public function thisPostgres()
    {
        return "This is PostgreSQL";
    }
}

class DB {

    /**
     * @var null|MySQL
     */
    public $adapters = null;

    /**
     * @param $name
     * @param IAdapter $params
     * @return $this
     */
    public function addAdapter($name,IAdapter $class)
    {
        $this->adapters[$name] = $class;
        return $this;
    }

    /**
     * @return mixed|MySQL|PostgreSQL
     */
    public function getAdapter($name)
    {
        return $this->adapters[$name];
    }
}
никаких проверок и прочего, чисто пример.

Естественно, при попытке вызвать getAdapter() выпадает весь список методов
из двух классов одновременно.
PHP:
$db = new DB();
$db->addAdapter("db1",new MySQL());
$db->getAdapter("db1")->                        // выпадет сразу getAdapter(), thisMysql(), thisPostgres()
мне нужно чтобы выпали только 2 функции, которые действительно относятся к этому адаптеру.
Можно же как-то заставить правильно работать автокомплит в подобном примере?

И хотелось бы применить грамотное решение, скорее всего тут паттерны могут придти на помощь)

Спасибо!)
 

AmdY

Пью пиво
Команда форума
А для чего ты используешь адаптер? У тебя непонимание смысла вот в этом коде, он должен выглядеть так
PHP:
/**
    * @return IAdapter <----
    */
    public function getAdapter($name)
    {
        return $this->adapters[$name];
    }
И это вообще не адаптер. Адаптер должен обвалакивать (декорировать) объекты, чтобы из вне вызывали метод ->this(), а он уже выберет что вызвать у адаптируемого объекта.
 

SergXP

Новичок
А для чего ты используешь адаптер?
на данный момент этот код написан в качестве примера
пытаюсь разобраться, как написать так, чтобы ide правильно выдала список методов из класса

И это вообще не адаптер. Адаптер должен обвалакивать (декорировать) объекты, чтобы из вне вызывали метод ->this(), а он уже выберет что вызвать у адаптируемого объекта.
согласен, буду признателен, если Вы покажите пример на коде :)
потому что возможно, в этом моя и ошибка))

дело в том, что как нам известно, бывают такие случаи, когда модель может иметь различные типы
Например, БД: типы подключения(PDO и тд) и БД(Mysql, PostgreSQL и тд).
И менее запутаный случай, кэширование: file, apc, xcache, memcache и тд

вызвав
PHP:
$cache->getAdapter("apc")->  // я бы хотел видеть именно методы из своего класса APC
// можно конечно сделать так
$cache->getAdapterApc()-> // конечно если прописать @return Apc  - то выведутся методы класса Apc
при таком варианте, выводятся методы только интерфейса.
PHP:
/**
    * @return IAdapter <----
    */
    public function getAdapter($name)
    {
        return $this->adapters[$name];
    }
или вообще не стоит заморачиваться и оставить интерфейс и абстрактный класс..
только тогда не получится расширить набор методов отдельного класса, а если всписать метод он не отобразится в автокомплите)
 

SergXP

Новичок
в общем, ide еще не умеют разбирать factory)
манипуляции с phpdoc результатов тоже не принесли.
 

fixxxer

К.О.
Партнер клуба
Если под IDE понимается сторм, есть такое, но только для статических factory-методов
 
Сверху