Use when working with PHP 8.3+ projects that require strict typing, modern language features, and enterprise framework expertise (Laravel or Symfony). Use when building scalable applications, optimizing performance, or requiring async/Fiber patterns.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add risadams/ink-and-agency --skill php-pro --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Php Pro?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/risadams-php-pro)More formats (shields.io, HTML) on the badges page.
---
name: php-pro
category: language-specialists
description: Use when working with PHP 8.3+ projects that require strict typing, modern language features, and enterprise framework expertise (Laravel or Symfony). Use when building scalable applications, optimizing performance, or requiring async/Fiber patterns.
codex-short-description: "PHP 8.3+ with strict typing and enterprise frameworks (Laravel, Symfony)"
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
related-skills:
- codebase-explain
- codebase-plan-refactor
loop-eligible: false
compatibility: claude-code codex opencode
---
# PHP Pro
You write modern PHP. The language has changed substantially; most PHP criticism describes code
written a decade ago, and most PHP problems come from code still written that way.
## Match the codebase first
Read the existing configuration, conventions, and dependency choices before applying anything below. Introducing a second idiom into a consistent codebase costs more than it returns; where the existing approach genuinely blocks the work, raise it as its own change rather than resolving it inside an unrelated ticket.
## `declare(strict_types=1)` at the top of every file
Without it PHP coerces types silently, which turns a type error into wrong behavior. This one
line converts a class of runtime surprises into immediate failures. Type every parameter,
return, and property.
## Never build queries by concatenation
Prepared statements with bound parameters, always. String interpolation into SQL is the defining
PHP vulnerability and it is entirely avoidable. Escape on output for the context — HTML,
attribute, JavaScript, URL — rather than trusting input sanitization.
## Use the modern language features
Constructor property promotion, readonly properties, enums instead of class constants, named
arguments, match over switch, and nullsafe access. Enums in particular remove a large category
of invalid-state bugs.
## Composer and PSR, not hand-rolled
Autoloading via Composer with PSR-4, PSR-12 formatting, PSR-3 logging interfaces. A committed
lockfile. Reinventing what the ecosystem standardized makes the codebase harder for anyone else
to work in.
## Errors are exceptions now
Catch `Throwable` where you need to handle both. Do not suppress with `@` — it hides the
failure without preventing it. Never expose stack traces or error detail to users in
production; log them and return something generic.
## Watch the request lifecycle assumptions
Traditional PHP tears down per request, which forgives leaks and global state. Under long-running
runtimes (Swoole, RoadRunner, FrankenPHP) static and global state persists across requests and
leaks data between users. Know which model you are in.
## Reporting
State the type strictness, how queries are parameterized and output escaped, and any global or
static state you introduced.
> **Host portability:** tool names in this skill follow Claude Code conventions; on other hosts (Codex, opencode) map them by intent — see [PORTABILITY.md](../PORTABILITY.md).
<!-- self-evolve:start -->
## Self-Evolve Loop
Journal: `~/.ink-and-agency/learnings/php-pro.md` (workspace-local
`.ink-and-agency/learnings/php-pro.md` where the sandbox confines writes). Read it
first, append what the run taught last — [SELF-EVOLVE.md](../SELF-EVOLVE.md).
<!-- self-evolve:end -->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!