我应该如何PHPDoc回调?

时间:2011-02-07 07:31:29

标签: php 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;
}

我不确定变量$filter的PHPDoc应该是什么 - 它是一个回调,这是我所指出的,但我不确定这是否正确。

此外,对此代码中质量(或缺少)的任何其他评论将不胜感激:)

4 个答案:

答案 0 :(得分:35)

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

(我很惊讶其他人没有提及callable,这并不是什么新鲜事,多年来一直在各地使用 - 据我所知,callback不是,而且从来都不是定义的PHP pseudo-type

请注意,callable不仅包括闭包,还包括“旧学校”PHP回调,例如: array($object, 'methodName')array('ClassName', 'methodName')甚至'function_name' - 为了最大限度地提高API的实用性,您应该涵盖所有这些用例,这非常简单,因为call_user_funccall_user_func_array支持所有四种类型的callables:function-name as string,object / method-name,class / method-name和closure。

答案 1 :(得分:6)

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

答案 2 :(得分:1)

phpDoc并没有真正指定接受的变量类型是什么,只是它们应该是有效的php变量类型的名称。在这种情况下,“回调”是正确的。这是PHP中伪类型的名称。

答案 3 :(得分:0)

@param标记的文档似乎没有在eons中更新,因此它没有说明使用create_function()进行的闭包甚至回调。

如果phpDocumentor拒绝将callback识别为数据类型,则必须使用mixed