Agent-skills-standard php-language

Apply core PHP language standards and modern 8.x features. Use when working with PHP 8.x features like enums, fibers, readonly properties, or named arguments. (triggers: **/*.php, declare, readonly, match, constructor, promotion, types)

install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/php/php-language" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-php-language && rm -rf "$T"
manifest: skills/php/php-language/SKILL.md
source content

PHP Language Standards

Priority: P0 (CRITICAL)

Structure

src/
└── {Namespace}/
    └── {Class}.php

Implementation Guidelines

Core Language Standards

  • Strict Typing: Declare
    declare(strict_types=1);
    at very top of every file.
  • Type Hinting: Apply scalar type hints (e.g.,
    string
    ,
    int
    ) and return types to all functions.
  • Strict Comparison: Avoid loose
    ==
    comparison
    ; always use
    ===
    for strict equality.

Modern PHP 8+ Patterns

  • Match Expressions: Prefer
    match($status)
    over
    switch
    for value returns. It provides strict comparison and exhaustive by default.
  • Default Case: Use
    default => throw new InvalidArgumentException($status)
    to handle unknown states.
  • Read-only: Use
    public readonly string $name
    for properties set once at construction.
  • Property Promotion: Use
    public function __construct(public string $name) {}
    to reduce boilerplate.
  • Named Arguments: Call functions with
    name: 'John', age: 25
    to skip optional parameters.
  • Flexible Types: Use Union types (
    int|string
    )
    and Intersection types (
    Countable&Traversable
    )
    .

Anti-Patterns

  • No untyped functions: Declare return and parameter types always.
  • No loose
    ==
    comparison
    : Use
    ===
    for strict equality.
  • No
    switch
    for value mapping
    : Use
    match
    expressions instead.
  • No global namespace logic: Organize in classes and namespaces.

References