Что корректный путь состоит в том, чтобы зарегистрировать константы PHP (определяют) с phpDocumentor

Как мы должны зарегистрировать (с phpDocumentor), константы, определенные с, определяют () в PHP?

Я ничего не нашел в документах, но нашел следующий пример (который я не вижу, что это - использование) в sample2.php:

/**#@+
 * Constants
 */
/**
 * first constant
 */
define('testing', 6);
/**
 * second constant
 */
define('anotherconstant', strlen('hello'));

Кто-либо может сказать мне, что лучший способ состоит в том, чтобы зарегистрировать константы в PHP с phpDocumentor?

14
задан Brian Tompsett - 汤莱恩 27 November 2015 в 13:51
поделиться

2 ответа

Typedef предназначены для слабаки. Вот простой, механический метод для выяснения волосатых объявлений:

          a                 -- a
          a[N]              -- is an N-element array
         *a[N]              -- of pointers
        (*a[N])()           -- to functions
       *(*a[N])()           -- returning pointers
      (*(*a[N])())()        -- to functions
     *(*(*a[N])())()        -- returning pointers
char *(*(*a[N])())()        -- to char.  

Итак, ответ находится в окрестности char * (* (* a [N]) ()) (); . Я говорю «по соседству», так как никогда не уточняется, какие аргументы принимают функции.

Это назойливый вопрос интервью (типы этого уродливого действительно редкие IME), но он дает интервьюеру представление о том, насколько хорошо вы понимаете деклараторов. Либо это, либо они были скучны и просто хотели посмотреть, могут ли они заставить ваш мозг ослабеть.

EDIT

Большинство остальных рекомендует использовать typedefs. Единственный раз, когда я рекомендую использовать typedef, это если тип предназначен быть действительно непрозрачным (то есть, не манипулируемый непосредственно программистом, но переданный в API, как тип FILE). В противном случае, если программист предназначен для непосредственного манипулирования объектами такого типа, то IME лучше иметь всю имеющуюся в объявлении информацию, как бы уродливую. Например, что-то вроде

 NameFuncPickerPointer a[N];

не дает мне никакой информации о том, как на самом деле использовать a [i] . Я не знаю, что a [i] является вызываемым, или что он возвращает, или какие аргументы он должен принять (если есть), или многое другое. Я должен пойти искать typedef

typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;

и из этой головоломки, как написать выражение, которое на самом деле называет одну из функций. В то время как использование «голого», не типизированного объявления, я сразу знаю, что структура вызова

char *theName = (*(*a[i])())();
-121--1716147-

Я бы рекомендовал использовать следующий подход:

  • Создать класс Row для представления строки, считанной из ResultSet . Это может быть простой оберткой вокруг объекта Object [] .
  • Создайте коллекцию List < строка > и подкласс AbstractTaureModel для поддержки этой коллекции.
  • Используйте SwingWorker для заполнения списка < строка > путем чтения из базового ResultSet в фоновом потоке (т.е. в методе doInBackground () ). Вызовите метод SwingWorker publish для публикации строки в потоке отправки событий (например, каждые 100 строк).
  • При вызове метода SwingWorker процесса с последним считанным фрагментом строк добавьте их в Список < Строка > и запустите соответствующие Событие таблицы для обновления дисплея.
  • Также используйте ResultSetMetaData для определения Class каждого столбца в определении TaureModel . Это приведет к правильной визуализации (что не произойдет, если вы просто используете массив 2D Object [] [] ).

Преимущество этого подхода заключается в том, что пользовательский интерфейс не будет блокироваться при обработке больших результирующих наборов ,и что дисплей будет обновляться постепенно по мере обработки результатов.

EDIT

Ниже добавлен пример кода:

/**
 * Simple wrapper around Object[] representing a row from the ResultSet.
 */
private class Row {
  private final Object[] values;

  public Row(Object[] values) {
    this.values = values;
  }

  public int getSize() {
    return values.length;
  }

  public Object getValue(int i) {
    return values[i];
  }
}

// TableModel implementation that will be populated by SwingWorker.
public class ResultSetTableModel extends AbstractTableModel {
  private final ResultSetMetaData rsmd;
  private final List<Row> rows;

  public ResultSetTableModel(ResultSetMetaData rsmd) {
    this.rsmd = rsmd;
    this.rows = new ArrayList<Row>();
  }

  public int getRowCount() {
    return rows.size();
  }

  public int getColumnCount() {
    return rsmd.getColumnCount();
  }

  public Object getValue(int row, int column) {
    return rows.get(row).getValue(column);
  }

  public String getColumnName(int col) {
    return rsmd.getColumnName(col - 1); // ResultSetMetaData columns indexed from 1, not 0.
  }

  public Class<?> getColumnClass(int col) {
    // TODO: Convert SQL type (int) returned by ResultSetMetaData.getType(col) to Java Class.
  }
}

// SwingWorker implementation
new SwingWorker<Void, Row>() {
  public Void doInBackground() {
    // TODO: Process ResultSet and create Rows.  Call publish() for every N rows created.
  }

  protected void process(Row... chunks) {
    // TODO: Add to ResultSetTableModel List and fire TableEvent.
  }
}.execute();
-121--2191627-

Определите инструкции, которые, как правило, комментируются только описательным текстом, так что это в основном то, как вы его комментируете.

Для получения дополнительной информации о шаблоне DocBlock тэга /* * # @ + ознакомьтесь с на странице руководства .

6
ответ дан 1 December 2019 в 16:15
поделиться

На phpDoc.org есть элементы, которые можно задокументировать .

У вас также есть пример документирования define () (второй фрагмент кода и окружающие его абзацы).

1
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: