Code completion в PhpStorm

Здравствуйте. Нахожусь в поиске лучшей ide for php. Сегодня поставил phpstorm. Нашел плюсы, нашел минусы. Например автокомплит.
Он работает не так как в Netbeans или Zend. Это был сюрприз, но один и тот же класс в одном файле проекта подсказывается, а в другом — нет. Файл с классом проинедксирован. После того как наберешь ClassName::, ide подскажет методы класса. Т.е. ide знает о классе и его атрибутах.
Уважаемые пользователи и разработчики phpStorm, подскажите пожалуйста, как решить этот вопрос.
Спасибо!

15 comments

Здраствуйте Vladimir,

Кусок кода не помешал бы, а то кофейная гуща закончилась на сегодня (а у других ее вообще может не быть)...
(пример надо такой что бы видеть контекст -- как объявлялась переменная (если такая используется) и т.п.)

P.S.
Which PhpStorm version do you use?

0

/**
* Skeleton subclass for performing query and update operations on the 'block_img' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
*
* @package propel.generator.pash
*/
class BlockImgPeer extends BaseBlockImgPeer {

} // BlockImgPeer



/**
* Base static class for performing query and update operations on the 'block_img' table.
*
*
*
* @package propel.generator.pash.om
*/
abstract class BaseBlockImgPeer {

… тут константы и методы, стандартные для Propel…все static

}

При наборе в контроллере BlockImg, Выдает подсказку только на BaseBlockImgPeer
Вот его код:

/**
* This class defines the structure of the 'block_img' table.
*
*
*
* This map class is used by Propel to do runtime db structure discovery.
* For example, the createSelectSql() method checks the type of a given column used in an
* ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive
* (i.e. if it's a text column type).
*
* @package propel.generator.pash.map
*/
class BlockImgTableMap extends TableMap {

/**
* The (dot-path) name of this class
*/
const CLASS_NAME = 'pash.map.BlockImgTableMap';

/**
* Initialize the table attributes, columns and validators
* Relations are not initialized by this method since they are lazy loaded
*
* @return void
* @throws PropelException
*/
public function initialize()
{
// attributes
$this->setName('block_img');
$this->setPhpName('BlockImg');
$this->setClassname('BlockImg');
$this->setPackage('pash');
$this->setUseIdGenerator(true);
// columns
$this->addPrimaryKey('ID', 'Id', 'INTEGER', true, 11, null);
$this->addColumn('BLOCK_DESCRIPT', 'BlockDescript', 'VARCHAR', true, 255, '');
$this->addColumn('FILE_NAME', 'FileName', 'VARCHAR', false, 255, null);
$this->addColumn('ALT_TEXT', 'AltText', 'VARCHAR', true, 255, '');
$this->addColumn('CLASS_TEXT', 'ClassText', 'VARCHAR', true, 255, '');
$this->addColumn('STYLE_TEXT', 'StyleText', 'LONGVARCHAR', true, null, null);
$this->addColumn('TITLE_TEXT', 'TitleText', 'VARCHAR', true, 255, '');
$this->addColumn('WIDTH', 'Width', 'INTEGER', true, 11, 0);
$this->addColumn('HEIGHT', 'Height', 'INTEGER', true, 11, 0);
$this->addColumn('VERSION', 'Version', 'INTEGER', false, 11, 0);
// validators
} // initialize()

/**
* Build the RelationMap objects for this table relationships
*/
public function buildRelations()
{
} // buildRelations()

} // BlockImgTableMap

new BlockImg-идёт подсказка. Если BlockImg-подсказки нет. wmw85, Сегодня в 11:43
Классы BlockImgPeer и BaseBlockImgPeer — в разных файлах. Все классы подключаются через spl_autoload

0

Thnx for examples -- unfortunately I could not make any useful conclusions out of it (I see class declarations but not the way/how/where you using your class).
I originally thought you had some simple situation when PhpStorm cannot figure out the variable type (for example: $a = SomeDispatcher::Factory('SomeClass'); //or something like that ).

new BlockImg-идёт подсказка. Если BlockImg-подсказки нет.

?:| ... confused...

Can you please provide an example when it works and when it does not (as it is impossible to guess what is wrong -- the issue may already have been reported .. or it may be something that can be "fixed" with PHPDoc comment). For example:

$a = new SomeClass();
$a-> // works here

$b = SomeDispatcher::Factory('SomeClass')
$b-> // does not work here


Any way -- there are some issues with code completion reported on Issue Tracker (mostly relating to namespaces support) -- maybe you will find your case. For example: http://youtrack.jetbrains.net/issues/WI?q=autocomplete


Sometimes (when variable name is reused, for example) the code completion may work wrong:

$a = new SomeClass();
$a-> // may not be what you are expecting
$a = new SomeDifferentClass();
$a-> // may not be what you are expecting

0

Пробема заключается не в том что мне не показываются АТРИБУТЫ класса, а в том, что не подсказывает само ИМЯ класса, при начале его набора.
Нет, фабрики и динамический вызов тут не причем.
Я напрямую набираю название класса с тем чтобы вызвать static метод( SomeClass::doIt() ), например -
SomeCla - тут я жду что мне подскажут SomeClass, но нет.
Если же я набираю
$o = new  SomeCla - тут мне правильно подсказывается SomeClass. Но пробема в том, что SomeClass - содержит только static переменные и методы.
Пожалуйста, прежде че отправлять меня в трак, давайте разберемся есть ли тут ошибка, и как ее поправить.
Если как то можно попровить с помощью phpDoc - хорошо. подскажите как.
Спасибо, что пытаетесь мне помочь.

0
Пробема заключается не в том что мне не показываются АТРИБУТЫ класса, а в том, что не подсказывает само ИМЯ класса, при начале его набора.

NOW I see where you are having problem -- no where in your previous posts you have mentioned that you actually having problems with class name and not with fields/methods. All what I have mentioned before was regarding fields/methods completion.

I have never experienced anything like that myself (I have suggestions for all class names/libraries that I'm using (like Smarty, Swift, Zend, Yii)), so I cannot give you 100% positive answer on why it may happen. Here are some suggestions/ideas that may help resolve this issue:

1) try File | Invalidate Caches... -- usually that helps in such weird situations.
2) Do you expect autocomplete suggestion window pop up automatically (and this does not happening) or you invoking it manually (Ctrl+Space is default shortcut) and you see "no suggestions" message ?
     if 1) -- check your settings in File | Settings | Editor | Code Completion
     if 2) - should work ... unless it is a letter-case issue
     In any case -- please check File | Settings | Editor | Code Completion -> Case sensitive completion
3) When you use Ctrl+N (default shortcut for Go to | Class) -- does it show the class when you typing its name there ?

Please also state your OS, JDK version used by PhpStorm (Help | About) -- devs may need this info.

0

1) пробовал
2) Использую Ctrl+Space. При наборе BlockImg => Ctrl+Space => подсказывает BlockImgTableMap (поэтому указал код данного файла в посте выше), но не показывает BlockImgPeer
3) по клику Ctrl + N находятся все классы находятся, в том числе BlockImgPeer
3б) более того, после набора "BlockImgPeer::" - автокомплит правильно выдает все атрибуты класса.
4)
build #ps 102.114
JDK 1.6.0_21

0

Sorry, no real ideas then. Here what I have tried (quick test):

test1.php

<?php

class BlockImgTableMap {

    public static function someBlockImgTableMap() {

    }
}

test2.php

<?php
class BlockImgPeer extends BaseBlockImgPeer {

    public function someBlockImgPeer() {

    }
}

abstract class BaseBlockImgPeer {

}

class BlockImage {

    public static function someBlockImage() {

    }
}

maintest.php

<?php

BlockIm<CTRL+SPACE>

For the simple examples above I see 2 suggestions: BlockImage & BlockImgTableMap.

If I change declaration of someBlockImgPeer() to public static function someBlockImgPeer(), then PhpStorm will show 3 suggestions: BlockImage, BlockImgPeer & BlockImgTableMap.

Obviously, the above example is extremely simple and most likely will not give any hints on why it does not work on your setup (especially since PhpStorm suggests methods when providing full class name (your 3б) point and it works fine (can complete class name) in another file) ). Maybe it depends on context (where it is attempted to be used)? No other ideas.

Lets hope one of the dev will see this topic soon and will be able to help you.

0

День добрый! Есть анноящий баг, связанный с автодополнением, который сильно напрягает.

Пишу под Yii, в нем есть базовый класс WiiBase, который определяется в двух файлах -  YiiBase.php и yiilite.php - в последнем, соответственно, без пхпдока.

yiilite.php нигде не используется и упоминается всего лишь в одном месте - в качестве элемента массива. В проекте инклудится именно YiiBase.php с пхпдоками. ОДНАКО после сканирования пытается использовать для формирования автодополнений именно yiilite.php - соответственно автодополнение не работает.

0

Кажется я нашел причину. Propel генерирует классы для работы с базой данных. 3+3 класса для запросов, 1 map. Нас интересуют классы для запросов. Например класс Peer:

class BlockImgPeer extends BaseBlockImgPeer {

   
} // BlockImgPeer
Как видите, он пустой. Данный клас сделан для расширения BaseBlockImgPeer. Во время следующей генерации файл с классом BaseBlockImgPeer будет перезаписан(не всегда, но это тонкости), а файл с BlockImgPeer с "вручную" дописанным мною кодом останется старый. Но дело в том что данные классы чаще пустые, и редко имеют дополнительные методы.
Что относится к PS - он не хочет подсказывать класс если в нем нет ни одного атрибута, как в данном примере. При этом, что как мне кажется является ошибкой, PS не учитывает методы предка.
Ок, причина в общих чертах понятна, не ясно, что с этим делать.

0

I see two options:

1) always add some dummy method to such empty classes so that PhpStorm will pick them up to suggest in completion popup. But this is not really good approach (to do such things just to please IDE -- this is not PHPDoc comment which is beneficial in any case)

2) PhpStorm does not do its' job properly and this is a bug (that is my position on this situation). Therefore it needs to be reported to Issue Tracker and hopefully it will be fixed in next EAP or at least v2.0 final (which is (at least was) planned to be released at the end of January 2011).

As you have already mentioned, PhpStorm does not treat empty class (which has no fields/methods itself but extends parent class that does have them) as a option/suggestion is autocomplete popup. But it should -- as parent's methods are still available to the child class.


This is the code that can be used as a test case in such ticket:

<?php
class BlockImgPeer extends BlockImgPeerBASE {

}

class BlockImgPeerGood extends BlockImgPeerBASE {

    public static function someBlockImgPeerGood() {

    }
}

abstract class BlockImgPeerBASE {

    public static function someBlockImgPeerBASE() {

    }
}

class BlockImage {

    public static function someBlockImage() {

    }
}

BlockIm<Ctrl+Space>

Actual suggestions: BlockImage, BlockImgePeerBASE, BlockImgPeerGood
Expected suggestions: (all 4 classes) BlockImage, BlockImgePeerBASE, BlockImgPeerGood, BlockImgPeer

It's up to you what you want to do -- I would report it anyway.

0

вы правы дописывать атрибут в "пустой" класс не выход.
Теперь мне нужно сообщить об ошибке?

0

If you agree with me that this is a bug (based on the info collected so far and simple test case) -- the yes.

If you do not want to do it yourself (or simply have no time: it needs to be done in English with proper description/explanation) then I can do it myself later.

0

Please sign in to leave a comment.