<rmcreative>

RSS

Автодополнение свойств классов в PHP IDE

16 сентября 2008

В ночных билдах Eclipse PDT 2.0 появилась долгожданная для многих возможность. Теперь можно воспользоваться синтаксисом phpDoc 1.4+:

/**
 * @property MyClass $regular MyClass property
 */
class TestClass { 
    private $_thingy;
 
    function __get($var){
        switch ($var) {
            case 'regular' :
                return $this->_thingy;
        }
    }
 
    function __set($var, $val){
        switch ($var) {
            case 'regular' :
                if (is_string($val)) {
                    $this->_thingy = $val;
            }
        }
    }
}

И получить дополнение методов класса MyClass для такого кода:

$my_obj = new TestClass();
$my_obj->regular

Попробовать можно уже сейчас

Комментарии RSS

  1. №666
    Igor Sazhnev
    Igor Sazhnev 03 окт. 2008 г., 15:16:44

    Привет.

    Подскажи плз, может сталкивался?

    Поставил себе pdt2.0 integration build от 24/09. Не хочет выдавать автокомплит на переменные, полученные из статического метода, типа такого

    $val=MyClass::getInstance();

    $val->xxx() - не дает

    в методе MyClass::getInstance прописан @return, но комплит дает только при прямом создании объекта через new или описании типа объекта в @var (но т.к. у меня локальная переменная,то не очень подходит).

    Это баг или просто еще не дошли у разработчиков руки?

    И, если не сложно, подскажи, где берешь инфу о новых фичах PDT? Найти в инете что-то сложно как-то :(

    Спасибо

  2. №667
    Sam
    Sam 03 окт. 2008 г., 15:20:56

    Эту информацию частично вычитал у Alex-а. Кстати, извиняюсь, забыл упомянуть…

    Тут скорее всего недоработка. Думаю, ещё исправят…

    На всякий случай, можно тестовый код?

  3. №668
    Igor Sazhnev
    Igor Sazhnev 03 окт. 2008 г., 17:14:33

    Ну, что то такое

    class foo {
     private static $inst=null;
     /**
      * @return foo
      */
     public static function bar() {
      if (!self::inst) self::$inst=new foo();
      return self::$inst;
     }
     
     public static function baz() {
      return new foo();
     }
     
     public function xx() {
      return 'yy';
     }
    }
     
    // has complit on new
    $has_complit=new foo();
    $has_complit->
     
    // no complit on static with @return php-doc
    $no_complit=foo::bar();
    $no_complit->
     
    // has complit on static without php-doc, but with 'new' in method (dltk in work?)
    $has_complit_var=foo::baz();
    $has_complit->

    Ну, там где оборвано пробовать complit

    Т.е. похоже на php-doc он забивает в этом случае и использует DLTK возможности для просмотра дерева.

  4. №669
    Igor Sazhnev
    Igor Sazhnev 03 окт. 2008 г., 17:40:58

    О, сорри, в последней строке должно быть $has_complit_var-> , тем не менее это суть не меняет

  5. №671
    Sam
    Sam 03 окт. 2008 г., 18:15:53

    Да, похоже на правду. Можно попробовать отрепортить.

  6. №1076
    Алексей
    Алексей 12 янв. 2009 г., 19:01:19

    Привет.

    А получилось таким способом сделать автодополнение на подобие следующего:

    /**
     * @property Lib123 $lib123 Lib123 property
     */
    ...
    $this->load->library('lib123');
    $this->lib123->

    У меня ничего не вышло :(

  7. №1077
    Sam
    Sam 12 янв. 2009 г., 19:06:12

    Алексей

    Делается это немного не так…

    class MyController extends Controller {
     /**
      * @var Lib123
      */
     var $lib123;
     …
    }

    Точно работает в ночных сборках NetBeans7 и Zend Studio 6.

  8. №1078
    Алексей
    Алексей 12 янв. 2009 г., 19:28:57

    Я так пробовал, но меня не устроили два момента:

    1. Это работает с библиотекой, а вот с моделью такое не проходит. CI начинает ругаться:

    The model name you are loading is the name of a resource that is already being used: model123.

    Можно обойти, если в конструкторе написать

    unset($this->model123);

    но как-то это неправильно, чтоли.

    1. Автодополнение работает только в MyController, т.е.
    class Welcome extends MyController {public function index() {
        $this-> //отображает lib123
        $this->lib123-> // автодополнение не работает
      }}
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.