我应该如何 PHPDoc 回调?

Posted

技术标签:

【中文标题】我应该如何 PHPDoc 回调?【英文标题】:How should I PHPDoc a callback? 【发布时间】:2011-06-22 13:57:07 【问题描述】:

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

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

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

此外,任何其他关于此代码质量(或缺乏质量)的 cmets 将不胜感激:)

【问题讨论】:

【参考方案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 都支持所有四种可调用对象:函数名作为字符串、对象/方法名、类/方法名和闭包。

【讨论】:

写完所有这些答案后,callback 是正确答案。引用您链接到的 PHP 伪类型文章:“在 PHP 5.4 引入可调用类型提示之前,本文档中使用了回调伪类型。它的含义完全相同。”所有其他答案和问题都早于 PHP 5.4,所以当时它们是正确的。【参考方案2】:

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

【讨论】:

这个答案在编写时是正确的。但是,从 PHP 5.4 开始,它不再是正确答案。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

如果 phpDocumentor 拒绝将 callback 识别为数据类型,您将不得不使用 mixed

【讨论】:

我不确定它是否将callback 识别为数据类型。 @Billy ONeal:我猜你必须通过 phpDocumentor 运行 PHP 文件并找出答案。或者,如果您只是非正式地执行此操作而无需生成文档页面,只需调用它callback 也不会受到伤害。

以上是关于我应该如何 PHPDoc 回调?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHPDoc 对 Callable 的参数进行类型提示?

PHPDoc 或类型提示类作为方法的参数

如何使用 PHP 解析 phpDoc 样式的注释块?

如何使用带有重载方法的phpDoc?

PHP注释规范(PHPDOC)总结

如何将 PHP 代码块放入 PHPDoc DocBlock