Настройка IDE под велосипеды

qwerty42

Новичок
Сабж. Есть несколько проектов на разных самописных cms, использующих неочевидные для ide способы хранения разных объектов(в т.ч. инстансов классов). Ни в phpstorm, ни в netbeans я не нашел способа сообщить ide, что, например, результат выполнения
PHP:
$this->fw->get('Routing');
можно использовать как экземпляр класса \FW\Kernel\Routing. Существуют ли способы решения этой проблемы? После долгой работы с C# в удобнейшем Visual Studio такое вот программирование "вслепую", без подсказок, очень напрягает.
 

AmdY

Пью пиво
Команда форума
/* @var $routing \FW\Kernel\Routing */
$routing = $this->fw->get('Routing');

либо для метода get прописать варианты ответов, но будет много мусора.
/**
* @return \FW\Kernel\RoutingInterface| \FW\Kernel\RequestInterface
*/
public function get($name)
 

qwerty42

Новичок
А как быть с разными экзотическими костылями(или фичами для более компактной записи кода, тут как посмотреть) вроде
PHP:
$this('varname')
, который обрабатывает __invoke?
 

qwerty42

Новичок
либо для метода get прописать варианты ответов, но будет много мусора.
/**
* @return \FW\Kernel\RoutingInterface| \FW\Kernel\RequestInterface
*/
public function get($name)
Ну этот мусор будет скрыт в "кишках" системы, так что особого дискомфорта при разработке не доставит. А как ide будет определять, что именно вернулось в ответе, если в комментарии будет 20-30 классов? Проверка вроде instanceof для каждого из них?
 

MiksIr

miksir@home:~$
Никак не будет определять, просто тупо давать хинты по всем перечисленным классам.
Так что phpdoc для конкретной переменной более верно. Если она часто используется в разных методах - то вынос в свойство класса и определение типа для этого свойства.
 

Dovg

Продвинутый новичок
А вам не кажется, что если у вас метод может вернуть один из 20-30 экземпляторов разных классов, то в архитектуре есть проблема?
Если метод возвращает одного из потомков для предка - делайте документацию для предка.
 

qwerty42

Новичок
phpdoc для конкретной переменной более верно
Не везде результат вызова кладется в переменную, кое-где он используется сразу, например
PHP:
$var = $this->getKernel('config')->load('...');
Я думал, что в популярных php ide есть конфиги, описывающие такие ситуации, ведь почти все фреймворки используют подобный синтаксис, тот же CI или Symfony.
 

qwerty42

Новичок
А вам не кажется, что если у вас метод может вернуть один из 20-30 экземпляторов разных классов, то в архитектуре есть проблема?
Если метод возвращает одного из потомков для предка - делайте документацию для предка.
Пример из официальной документации symfony:
PHP:
$templating = $this->get('templating');
$content = $templating->render(
    'AcmeHelloBundle:Hello:index.html.twig',
    array('name' => $name)
);
Интересно, сколько экземпляров разных классов может вернуть get?
Алсо, проблема в архитектуре не приложения, а языка. Без статического конструтора приходится либо синглтонами извращаться, либо вот такие коллекции котов в мешке городить.
 

MiksIr

miksir@home:~$
Переделайте на магию и магические методы в шапке класса опишите.
 

qwerty42

Новичок
Переделайте на магию и магические методы в шапке класса опишите.
Если в @return перечислить через | типы возвращаемых значений, то методы всех перечисленных классов в кучу смешаны в подсказках, не намного удобнее получается. Или вы имеете ввиду что-то другое?
 

Redjik

Джедай-мастер
PHP:
<?php
/**
 * @property CDbAuthManager $authManager The authorization manager component.
 * @property Wysiwyg $wysiwyg
 * @property ESettings $settings
 * @property EImageComponent $eImage
 * @property Bootstrap $bootstrap
 * @property MultiSiteComponent $multisite
 * @property MailSender $mSender
 * @property YandexMap $yaMap
 */
class CWebApplication{}

Yii::app()->wysiwyg->
 

qwerty42

Новичок
PHP:
<?php
/**
 * @property CDbAuthManager $authManager The authorization manager component.
 * @property Wysiwyg $wysiwyg
 * @property ESettings $settings
 * @property EImageComponent $eImage
 * @property Bootstrap $bootstrap
 * @property MultiSiteComponent $multisite
 * @property MailSender $mSender
 * @property YandexMap $yaMap
 */
class CWebApplication{}

Yii::app()->wysiwyg->
Вот, это оно. А если экземпляры возвращает__invoke, а не __get, можно как-нибудь наподобие описать? В одном проекте используются вызовы вроде $this('obj')->funct(...
 

qwerty42

Новичок
Хотя, по логике, с __invoke оно и не должно работать, ide-то не знает, что я передаю в качестве аргумента, а от аргумента как раз и зависит тип возвращаемого значения.
 

qwerty42

Новичок
Жалко, мне эта форма записи как-то сразу очень понравилась.
 
Сверху