Как мы должны зарегистрировать (с phpDocumentor), константы, определенные с, определяют () в PHP?
Я ничего не нашел в документах, но нашел следующий пример (который я не вижу, что это - использование) в sample2.php:
/**#@+
* Constants
*/
/**
* first constant
*/
define('testing', 6);
/**
* second constant
*/
define('anotherconstant', strlen('hello'));
Кто-либо может сказать мне, что лучший способ состоит в том, чтобы зарегистрировать константы в PHP с phpDocumentor?
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 тэга /* * # @ +
ознакомьтесь с на странице руководства .
На phpDoc.org есть элементы, которые можно задокументировать .
У вас также есть пример документирования define () (второй фрагмент кода и окружающие его абзацы).