# Check Encapsulation

> Analyzes PHP code for encapsulation violations. Detects public mutable state, exposed internals, Tell Don't Ask violations, getter/setter abuse, and information hiding breaches.

- Skill: `tomevault-io/check-encapsulation` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/check-encapsulation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/check-encapsulation/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/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

1. **Phase 1 — Public Mutable State:** Scan Domain entities for non-readonly public properties
2. **Phase 2 — Getter/Setter Abuse:** Count getters vs behavior methods, flag anemic entities
3. **Phase 3 — Tell Don't Ask:** Detect getter chains and external conditionals on object state
4. **Phase 4 — Collection Exposure:** Find methods returning internal arrays/collections directly
5. **Phase 5 — Exposed Internals:** Check for reflection usage, debug methods, mutable object returns
6. **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

```markdown
# 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 Model
- `structural-auditor` — DDD compliance
- `create-entity` — Generate rich entities
- `create-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)

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/dykyi-roman) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

