check-encapsulation
Encapsulation Analyzer
Overview
This skill analyzes PHP codebases for encapsulation violations — situations where internal state is exposed, getters/setters replace behavior, or the "Tell, Don't Ask" principle is violated.
When to Use
- Reviewing Domain layer entities and aggregates
- Detecting anemic domain models
- Checking for Law of Demeter violations
- Auditing collection exposure patterns
- Evaluating getter/behavior ratio in entities
Encapsulation Principles
| Principle | Description | Violation Indicator |
|---|---|---|
| Information Hiding | Internal state not exposed | Public properties, many getters |
| Tell Don't Ask | Objects perform actions, not expose data | Getter chains, external decisions |
| Behavioral Richness | Objects have behavior, not just data | Anemic domain model |
| Invariant Protection | State changes validate constraints | Public setters without validation |
Analysis Approach
- Phase 1 — Public Mutable State: Scan Domain entities for non-readonly public properties
- Phase 2 — Getter/Setter Abuse: Count getters vs behavior methods, flag anemic entities
- Phase 3 — Tell Don't Ask: Detect getter chains and external conditionals on object state
- Phase 4 — Collection Exposure: Find methods returning internal arrays/collections directly
- Phase 5 — Exposed Internals: Check for reflection usage, debug methods, mutable object returns
- Phase 6 — Constructor Issues: Flag too many dependencies, complex construction without factories
Detection Rules
| ID | Pattern | Grep Target |
|---|---|---|
| ENC-01 | Public mutable props | public string|public int|public array in Domain (exclude readonly) |
| ENC-02 | Setter methods | public function set[A-Z] in Entity/Aggregate |
| ENC-03 | Getter chains | ->get[A-Z].*->get[A-Z].*->get[A-Z] |
| ENC-04 | External conditionals | if \(\$.*->get[A-Z].*=== |
| ENC-05 | Switch on state | switch \(\$.*->get[A-Z]|match \(\$.*->get[A-Z] |
| ENC-06 | Collection return | public function get.*\(\): array in Entity |
| ENC-07 | Doctrine exposure | public function get.*\(\): Collection in Domain |
| ENC-08 | Reflection access | ReflectionClass|ReflectionProperty|setAccessible |
| ENC-09 | Debug exposure | public function toArray\(\)|dump\(\)|debug\(\) in Domain |
| ENC-10 | Complex construction | new [A-Z].*Entity\(|new [A-Z].*Aggregate\( in Application |
Severity Classification
| Issue | Severity |
|---|---|
| Public mutable state in Entity | Critical |
| Collection mutated externally | Critical |
| Anemic entity (ratio > 5.0) | Critical |
| Tell Don't Ask violation | Major |
| Getter chain (3+ levels) | Major |
| Internal array returned | Major |
| Setter in Aggregate | Minor |
| Reflection in non-test code | Minor |
Report Format
# Encapsulation Analysis Report
## Summary
| Issue Type | Critical | Warning | Info |
|------------|----------|---------|------|
| Public Mutable State | N | N | - |
| Getter/Setter Abuse | N | N | N |
| Tell Don't Ask | N | N | - |
| Collection Exposure | N | N | - |
| Exposed Internals | N | N | N |
**Encapsulation Score: X%**
## Findings
### [ID]: [Title]
- **File:** `path:line`
- **Issue:** [Description]
- **Code:** [Problematic snippet]
- **Expected:** [Correct pattern]
- **Skills:** [Related generator skills]
## Getter/Behavior Ratio
| Entity | Getters | Setters | Behavior | Ratio | Status |
|--------|---------|---------|----------|-------|--------|
**Target:** Ratio < 2.0
## Refactoring Recommendations
### Immediate
1. Make all entity properties private
2. Replace setters with behavior methods
3. Return collection copies, not references
### Short-term
4. Extract Value Objects for validated data
5. Add factory methods for complex construction
6. Remove getter chains (add shortcut methods)
### Long-term
7. Review anemic entities for missing behavior
8. Consider CQRS to separate read/write models
Integration
Works with:
detect-code-smells— Feature Envy, Anemic Modelstructural-auditor— DDD compliancecreate-entity— Generate rich entitiescreate-value-object— Encapsulated value types
References
references/patterns.md— detailed detection patterns with code examples, report format samples, metrics examples, and rich entity template- "Tell, Don't Ask" — Martin Fowler
- "Anemic Domain Model" — Martin Fowler
- "Object-Oriented Software Construction" (Bertrand Meyer)
- "Elegant Objects" (Yegor Bugayenko)
More from dykyi-roman/awesome-claude-code
psr-overview-knowledge
PHP Standards Recommendations (PSR) overview knowledge base. Provides comprehensive reference for all accepted PSRs including PSR-1,3,4,6,7,11,12,13,14,15,16,17,18,20. Use for PSR selection decisions and compliance audits.
22detect-code-smells
Detects code smells in PHP codebases. Identifies God Class, Feature Envy, Data Clumps, Long Parameter List, Long Method, Primitive Obsession, Message Chains, Inappropriate Intimacy. Generates actionable reports with refactoring recommendations.
15clean-arch-knowledge
Clean Architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Clean Architecture and Hexagonal Architecture audits.
15ddd-knowledge
DDD architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Domain-Driven Design audits.
14testing-knowledge
Testing knowledge base for PHP 8.4 projects. Provides testing pyramid, AAA pattern, naming conventions, isolation principles, DDD testing guidelines, and PHPUnit patterns.
12bug-root-cause-finder
Root cause analysis methods for PHP bugs. Provides 5 Whys technique, fault tree analysis, git bisect guidance, and stack trace parsing.
12