Подсказка типа переменной в Netbeans (PHP)


86

Просто любопытно, есть ли в netbeans способ давать подсказки типа для обычных переменных, чтобы intellisense уловил это. Я знаю, что вы можете сделать это для свойств класса, параметров функций, возвращаемых типов и т.д., но я не могу понять, как это сделать для обычных переменных. Это то, что действительно поможет в ситуациях, когда у вас есть метод, который может возвращать разные типы объектов (например, локатор служб).

ex что-то вроде:

/**
 * @var Some_Service $someService
 */
$someService = ServiceLocator::locate('someService');

При последующем использовании $ someService netbeans предоставит все доступные методы, определенные в классе Some_Service.


1
Это работает внутри класса для членов, но я не знаю, как это сделать в функциях или процедурном коде.
Дэвид Снабел-Коунт

1
Я бы подумал о том, чтобы переименовать это в подсказку типа переменной в PHP IDE, поскольку этот тип комментария должен работать во всех распространенных IDE (NEtBeans, Eclipse, ...).
shadyyx

Ответы:


187

Все, что вам нужно - это одна строка:

/* @var $varName Type_Name */

См. Эту статью в блоге PHP NetBeans: https://blogs.oracle.com/netbeansphp/entry/defining_a_variable_type_in

Примечание: По крайней мере, в версии 8.2; Ключ, кажется, такой:

  • Одиночная звездочка ( /*вместо /**).
  • Размещение типа после имени переменной.
  • Не иметь ничего до и после подсказки типа (кроме пробела, но даже это недопустимо, если комментарий не в одной строке).

17
Ключ здесь, кажется, одинарная звездочка / * вместо / **. По крайней мере, в версии 8.0. Благодарю.
Cypher

1
Кажется, вообще не работает, если нам нужно использовать vdoc для свойства объекта, то есть, $this->obj = $serviceLocator->get('obj');если я использую, /* @var $obj Obj */он не работает ...
shadyyx

2
@shadyyx В этом случае вам следует использовать /** @var Type_Name */, см. этот пост ?
Апостол

6
Помните, что вы можете ввести vdocстроку над переменной, которую вы собираетесь документировать, а затем нажать, Tabи это будет действовать как макрос для автоматического создания блока документации @johannes posts выше.
Tom Auger

1
Если вы хотите, чтобы NetBeans также поддерживал альтернативные синтаксисы, прокомментируйте / проголосуйте за запрос функции: netbeans.org/bugzilla/show_bug.cgi?id=267470
marcovtwout

24

Я знаю, что это более старый вопрос, но я искал аналогичный ответ для Eclipse / Zend Studio, и это тоже решило его.

** Обратите внимание, что он должен быть в одной строке с открытием и закрытием явно в этом стиле ...

/* @var $varName Type_Name */

Никаких других форматов нет ли ...

/**
 * @var $varName Type_Name
 */ 

или же...

// @var $varName Type_Name

казалось, вообще работает. Надеюсь, это кому-то поможет.


Использование метода двойной косой черты, указанного в последнем списке, не помогло мне в NetBeans 7.2
Дэвид

1
@David Может быть, это не так хорошо, но я сказал, что ТОЛЬКО первое работает. Хотя оба других являются действительными комментариями, ни один из них не работает с системой подсказок типов, по крайней мере, в отношении eclipse, не уверен в NetBeans.
oucil

1
Netbeans (8.01) принимает только первый вариант с использованием / *, но phpStorm (8) также поддерживает / **.
Jop van Raaij

9

Вы хотите задокументировать эту надоедливую магию переменные? (Да; в ​​настоящее время этот вопрос занимает первое место в рейтинге Google. Надеюсь, это кому-то поможет!)

@propertyТег позволяет документировать магический переменный PHP - те , реализовано с использованием __get()и __set(). Тег должен использоваться в документации непосредственно перед определением класса:

/**
 * Class Contact
 * @property string $firstName
 * @property string $lastName
 */
class Contact extends Model {
   ...

Эта запись запускает автозаполнение, протестированное в Netbeans 8.1 и PhpStorm 2016.1.

введите описание изображения здесь


3

Согласно этому отчету об ошибке , в NetBeans 9 изменится синтаксис :

/* @var $variable VarType */    // vdoc1 (legacy syntax)
/** @var VarType $variable */   // vdoc (new syntax)

Также стоит упомянуть, что вы можете добавить []к имени класса, чтобы указать массив объектов:

/* @var $foos Foo[] */
$foos = // ...

foreach ($foos as $foo) {
    // $foo will be hinted as Foo here
}

И не забывайте свое useутверждение, напримерuse Foo;


2

В netbeans 8.0.2 шаблон vdoc дает вам следующее:

/* @var $variable type */

Однако Netbeans не распознает это и не предоставит вам правильный список автозаполнения для ваших объектов. Вместо этого используйте это непосредственно перед объявлением переменной:

/** @var objectType $varName */

На самом деле я не видел большого использования стандартного vdoc шаблона , особенно для переменных класса, которые будут использоваться в качестве объектов PDO или PDOStatement.

Одно из решений, которое я использую, - это перейти в Инструменты / Параметры / Редактор / Шаблоны кода (с PHP, выбранным в качестве вашего языка) и добавить новый шаблон. Я назвал свой намек . Затем в разделе «Расширенный текст» используйте следующий шаблон:

/** @var ${VAR_TYPE variableFromNextAssignmentType default="ClassName"} $$${VARIABLE variableFromNextAssignmentName default="variable"} */

3
Хм, у меня NB 8.0.2, а у меня наоборот. Тип переменной / * @var $ * / отлично работает. Я действительно пробовал использовать ваш патч для шаблонов. но это не сработало.
userfuser

1
Я не совсем уверен, что происходило с моей копией netbeans, когда я впервые опубликовал этот ответ, но сейчас я использую 8.2. / * @var $ varName varType * / работает нормально.
Майк,

0

Для NetBeans IDE 8.2 синтаксис выглядит следующим образом:

class foobar{
    /** @var string $myvar: optional description here **/
    protected static $myvar;
}

Это обеспечит правильные подсказки типов, по крайней мере, для статических переменных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.