一般来说,在 PHP 中使用 DocBlock 是最佳实践之一。它对于以前版本的 PHP(低于 PHP 7.3 或特别是 7.4)非常有用。它通知开发人员类属性类型、期望的参数类型和方法返回的值(以防 PHP 中缺乏严格的类型)。
假设在 PHP 5.6 中,代码可能如下所示:
namespace App\Service\Catalog\Category;
use App\Entity\Catalog\Category\Category;
use App\Repository\Catalog\Category\CategoryRepository;
class CategoryService
{
/** @var CategoryRepository */
private $categoryRepository;
/** @var int */
private $currentNestingLevel = 1;
/**
* CategoryService constructor.
* @param CategoryRepository $categoryRepository
*/
public function __construct(Category $categoryRepository)
{
$this->categoryRepository = $categoryRepository;
}
/**
* @param $parentCategoryId
* @return array
*/
public function getCategoriesDataByParentCategoryId($parentCategoryId)
{
$categories = $this->categoryRepository->getByParentCategoryId($parentCategoryId);
$categoriesData = [];
foreach ($categories as $category) {
$categoriesData[] = $this->getCategoryData($category);
}
return $categoriesData;
}
}
但是在这种情况下,当我们使用 PHP 7.4 时,这些 DocBlocks 不提供任何附加信息:
namespace App\Service\Catalog\Category;
use App\Repository\Catalog\Category\CategoryRepository;
class CategoryService
{
private CategoryRepository $categoryRepository;
private int $currentNestingLevel = 1;
public function __construct(CategoryRepository $categoryRepository)
{
$this->categoryRepository = $categoryRepository;
}
public function getCategoriesDataByParentCategoryId(int $parentCategoryId): array
{
$categories = $this->categoryRepository->getByParentCategoryId($parentCategoryId);
$categoriesData = [];
foreach ($categories as $category) {
$categoriesData[] = $this->getCategoryData($category);
}
return $categoriesData;
}
}
Robert C. Martin 在 Clean code 中写道,对所有方法/变量等使用 JavaDoc(sic!) 是不好的做法,并且会降低代码的可读性。另外,他说有可能,注释(DocBlock)不反映指定元素的当前状态(例如,在 DocBlock 中我们有 int,但变量已更改为字符串)
正如我所检查的,PSR 标准主要只说明了如何使用 DocBlock 以及它们应该是什么样子,而不是什么时候应该使用它们。
你怎么看待这件事?我们应该始终对代码中的所有元素使用 DocBlock 还是仅在特定情况下使用 DocBlock?您在这两种情况下都看到了哪些优点和缺点?