我应该如何 PHPDoc 进行回调?

2022-08-30 15:42:06

我有一个方法,从数据库中提取修改后的预序树横向树,并使用回调函数进行过滤。例如:

/**
 * 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

正确的类型提示是 ,它已经在PhpStorm中提供了很长时间,并且是PSR-5的一部分,PSR-5目前正在规范中。callable

(我很惊讶没有其他人提到,这并不是什么新鲜事,多年来一直在各地使用 - 据我所知,它不是,也从来不是一个定义的PHP伪类型callablecallback)

请注意,这不仅包括闭包,还包括“老式”PHP回调,例如 或者甚至 - 为了最大限度地提高API的有用性,你应该涵盖所有这些用例,这很容易,因为call_user_funccall_user_func_array都支持所有四种可调用性:函数名称作为字符串,对象/方法名称,类/方法名称和闭包。callablearray($object, 'methodName')array('ClassName', 'methodName')'function_name'


答案 2

“回调”在phpDocumentor中确实可以作为有效的数据类型...我刚刚验证了它...至少使用 PHP 5.2.4。“有效数据类型”取决于您运行 phpDocumentor 的 PHP 版本是可行的。


推荐