我有一个方法从数据库中提取修改过的预订树横向树,并使用回调函数对其进行过滤。例如:
/**
* 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应该是什么 - 它是一个回调,这是我所指出的,但我不确定这是否正确。
此外,对此代码中质量(或缺少)的任何其他评论将不胜感激:)
答案 0 :(得分:35)
正确的类型提示是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支持所有四种类型的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
。