Help us improve
Share bugs, ideas, or general feedback.
From acc
Analyzes PHP code for comment quality issues: detects missing PHPDoc, outdated comments, commented-out code, obvious comments, self-documenting opportunities, and missing exception docs.
npx claudepluginhub dykyi-roman/awesome-claude-code --plugin accHow this skill is triggered — by the user, by Claude, or both
Slash command
/acc:check-commentsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Analyze PHP code for documentation and comment issues.
Enforces guidelines for clean code comments: use sparingly, ban commented-out code and change descriptions, avoid end-of-line comments. Use when adding, editing, or removing comments.
Review PHP code using PhpStorm inspections. Use when editing PHP files, reviewing code quality, fixing PHP issues, or when asked about PHP best practices.
Reviews code naming, comments, and documentation for clarity and accuracy. Provides a structured comments-first workflow and guidelines for writing valuable, non-redundant comments.
Share bugs, ideas, or general feedback.
Analyze PHP code for documentation and comment issues.
// BAD: No documentation on public method
public function process(array $items, bool $force = false): Result
{
}
// GOOD: Documented public method
/**
* Process items with optional force flag.
*
* @param array<Item> $items Items to process
* @param bool $force Force processing even if already processed
* @return Result Processing result with status and errors
*
* @throws ProcessingException When processing fails
*/
public function process(array $items, bool $force = false): Result
{
}
// BAD: Comment doesn't match code
// Calculates the discount percentage
public function calculateTax(Money $amount): Money
{
return $amount->multiply(0.21);
}
// BAD: TODO that's been done or is stale
// TODO: Add validation (added 3 years ago)
$this->validate($data);
// BAD: Incorrect parameter documentation
/**
* @param string $userId The user ID // Actually int
*/
public function findUser(int $userId): User {}
// BAD: Dead code cluttering the file
public function process(Order $order): void
{
// $this->legacyProcessor->process($order);
// if ($order->needsSpecialHandling()) {
// $this->specialHandler->handle($order);
// }
$this->newProcessor->process($order);
}
// Remove commented code - use version control instead
public function process(Order $order): void
{
$this->newProcessor->process($order);
}
// BAD: Comments stating the obvious
// Get the user
$user = $this->getUser();
// Increment counter
$counter++;
// Loop through items
foreach ($items as $item) {}
// GOOD: Comments explaining WHY
// Fetch fresh user to ensure permissions are current
$user = $this->getUser();
// BAD: Comment needed due to unclear code
// Check if user can access premium features
if ($user->level >= 3 && $user->subscription !== null && $user->subscription->isActive()) {}
// GOOD: Self-documenting
if ($user->canAccessPremiumFeatures()) {}
// BAD: Magic number with comment
// 86400 seconds in a day
$expiry = time() + 86400;
// GOOD: Named constant
$expiry = time() + self::SECONDS_PER_DAY;
// BAD: Throws not documented
public function divide(int $a, int $b): float
{
if ($b === 0) {
throw new DivisionByZeroException();
}
return $a / $b;
}
// GOOD: Throws documented
/**
* @throws DivisionByZeroException When divisor is zero
*/
public function divide(int $a, int $b): float {}
// BAD: File header noise
/***********************************
* UserService.php
* Created: 2024-01-01
* Author: John Doe
* Last Modified: 2024-06-15
***********************************/
// BAD: Section dividers
//////////////////////////////////
// GETTERS AND SETTERS
//////////////////////////////////
// BAD: Closing brace comments
} // end if
} // end foreach
} // end class
// BAD: Comment on same line as code
$total = $price * $quantity; // Calculate total
// GOOD: Comment on line before
// Calculate order total including quantity discount
$total = $this->calculateTotal($price, $quantity);
/**
* Classes: Brief description of purpose
*/
final class OrderProcessor
{
/**
* Public methods: What it does, params, returns, throws
*/
public function process(Order $order): Result {}
/**
* Complex private methods: When non-obvious
*/
private function calculateComplexDiscount(): Money {}
}
/**
* @param array<string, mixed> $config Configuration options
* @param list<int> $ids List of integer IDs
* @param Collection<int, User> $users User collection
* @return array{success: bool, errors: list<string>}
*/
# Commented out code
Grep: "^\s*//\s*\\\$|^\s*//\s*if\s*\(|^\s*//\s*foreach" --glob "**/*.php"
# TODO/FIXME
Grep: "TODO|FIXME|HACK|XXX" --glob "**/*.php"
# Missing PHPDoc on public method
Grep: "^\s*public\s+function" --glob "**/*.php"
# Compare with lines having /** before them
# Old-style type hints in comments
Grep: "@param\s+\w+\s+\\\$\w+.*\bint\b|\bstring\b" --glob "**/*.php"
| Pattern | Severity |
|---|---|
| Outdated/misleading comments | 🟠 Major |
| Commented-out code | 🟡 Minor |
| Missing PHPDoc on public API | 🟡 Minor |
| Obvious comments | 🟢 Suggestion |
| Missing @throws | 🟢 Suggestion |
### Comment Issue: [Description]
**Severity:** 🟠/🟡/🟢
**Location:** `file.php:line`
**Type:** [Missing PHPDoc|Outdated|Commented Code|...]
**Issue:**
[Description of the comment problem]
**Current:**
```php
// Calculate discount
public function calculateTax(): Money {}
Suggested:
/**
* Calculate applicable tax for the order.
*
* @return Money Tax amount in order currency
*/
public function calculateTax(): Money {}