Как я должен PHPDoc обратный вызов?
У меня есть метод, который извлекает измененное дерево дерева измененного дерева предзаказов из базы данных и фильтрует его с помощью функции обратного вызова. Например:
/**
* Recursive function for building the Cas_Template_TreeNode.
*
* @static
* @param array $rows
* @param callback $filter A function to filter the tree by (return a value convertible to false to remove the item from the tree)
* @return array
*/
private static function MakeTreeGivenDbRows($rows, $filter = null)
{
if ($filter === null)
{
$filter = function($unused)
{
return true;
};
}
$result = array();
$childrenCount = 0;
for ($idx = 0; $idx < count($rows); $idx += $childrenCount + 1)
{
$current = $rows[$idx];
$childrenCount = self::ChildrenCountFromRow($current);
if (!$filter($current))
{
continue;
}
$childrenStartAt = $idx + 1;
$childRows = array_slice($rows, $childrenStartAt, $childrenCount);
$children = self::MakeTreeGivenDbRows($childRows, $filter);
$result[] = new Cas_Template_TreeNode(self::MakeNodeGivenDbRow($current), $children);
}
if (empty($result))
{
return null;
}
return $result;
}
Я не уверен, что PHPDoc должен быть для переменной $filter
- это обратный вызов, который я указал, но я не уверен, что это правильно.
Кроме того, любые другие комментарии по качеству (или их отсутствию) в этом коде будут оценены:)
Ответы
Ответ 1
Правильный тип-подсказка callable
, который был доступен, например, PhpStorm в течение длительного времени, и является частью PSR-5, который в настоящее время находится под спецификацией.
(Я удивлен, что никто не упомянул callable
, он ничего нового и не использовался везде в течение многих лет - насколько мне известно, callback
не является и никогда не был определенным PHP pseudo-type)
Обратите внимание, что callable
включает не только замыкания, но и обратные вызовы PHP "старой школы", например. array($object, 'methodName')
или array('ClassName', 'methodName')
и даже 'function_name'
- чтобы максимизировать полезность вашего API, вы должны охватить все эти прецеденты, что довольно просто, поскольку call_user_func и call_user_func_array поддерживают все четыре разновидности вызовов: имя функции как строку, имя объекта/метода, class/method-name и закрытие.
Ответ 2
"callback" работает как действительный тип данных в phpDocumentor... Я просто проверил его... используя PHP 5.2.4, по крайней мере. Понятно, что "действительные типы данных" зависят от версии PHP, с которой вы запускаете phpDocumentor с.
Ответ 3
phpDoc на самом деле не указывает, что такое допустимые типы переменных, просто они должны быть именами допустимых типов переменных php. В этом случае "обратный вызов" будет правильным. Это имя псевдо-типа в PHP.
Ответ 4
Документация для тега @param
, похоже, не обновлялась за один раз, поэтому ничего не говорится о закрытии или даже обратных вызовах, сделанных с помощью create_function()
.
Если phpDocumentor отказывается распознавать callback
как тип данных, вам нужно перейти с mixed
.