# PHP Modern

> Write modern PHP 8.x code — typed properties, enums, readonly classes, match expressions, named arguments, union/intersection types, fibers, attributes, and constructor promotion. Use when writing PHP for Magento or any PHP 8.x project.

- Skill: `majiayu000/php-modern` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/php-modern`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/php-modern/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/php-modern

---


# Modern PHP 8.x Development

## Before writing code

**Fetch live docs**: Web-search `site:php.net manual migration` for the latest PHP migration guide and new features. Check `https://www.php.net/releases/` for current supported versions.

## PHP 8.0 Features

### Constructor Property Promotion

Declare and assign properties directly in the constructor signature — eliminates boilerplate. Heavily used in Magento service classes.

### Named Arguments

Call functions with parameter names: `array_slice(array: $arr, offset: 2)`. Improves readability for functions with many parameters.

### Match Expressions

Type-safe `switch` replacement that returns a value. No fall-through, strict comparison. Better than switch for value mapping.

### Union Types

`int|string` in parameter and return types. Allows multiple type declarations.

### Nullsafe Operator

`$obj?->method()?->property` — short-circuits to null if any part is null. Replaces nested null checks.

### Attributes

Native metadata annotations: `#[Route('/path')]`, `#[Override]`. Replace docblock annotations with first-class language support.

## PHP 8.1 Features

### Enums

First-class enumerations — backed (string/int) and unit enums. Perfect for status codes, types, categories. Use backed enums for database/API values.

### Readonly Properties

`public readonly string $name` — can only be set once (usually in constructor). Enforces immutability.

### Fibers

Lightweight concurrency primitives — PHP-level coroutines. Foundation for async frameworks. Limited direct usage in Magento.

### Intersection Types

`TypeA&TypeB` — value must satisfy ALL types. Useful for ensuring a parameter implements multiple interfaces.

### First-class Callable Syntax

`strlen(...)` creates a Closure from a function. Cleaner than `Closure::fromCallable('strlen')`.

## PHP 8.2 Features

### Readonly Classes

`readonly class Dto { ... }` — all properties are implicitly readonly. Perfect for Data Transfer Objects and value objects.

### Deprecated: Dynamic Properties

Creating properties not declared in the class is deprecated. Magento core addressed this throughout — always declare properties.

### Standalone Types

`true`, `false`, `null` as standalone types in declarations.

### Constants in Traits

Traits can now define constants.

## PHP 8.3 Features

### Typed Class Constants

`const string NAME = 'value';` — type-safe constants. Strengthens contract enforcement.

### `#[\Override]` Attribute

Documents that a method intentionally overrides a parent method. Compiler error if the parent method doesn't exist.

### `json_validate()` Function

Validate JSON without decoding — faster than `json_decode` + error check.

### Dynamic Class Constant Fetch

`$class::{$constant}` — dynamic constant access.

## PHP 8.4 Features

### Property Hooks

Define get/set behavior directly on properties:
```php
public string $name {
    set => strtolower($value);
    get => ucfirst($this->name);
}
```

### Asymmetric Visibility

`public private(set) string $name` — readable publicly, writable only privately.

## PHP for Magento Specifically

### Type Safety

- Use strict types: `declare(strict_types=1);` in all files
- Type all parameters, return types, and properties
- Use union types for nullable: `?string` or `string|null`

### Value Objects

Use readonly classes for DTOs and value objects — common in service layers.

### Enums for Status Codes

Replace string/int constants with backed enums for order statuses, product types, etc.

### Constructor Promotion in Magento

Magento uses constructor injection extensively — promotion reduces boilerplate significantly.

## Best Practices

- Always use `declare(strict_types=1);`
- Type everything: parameters, returns, properties, constants
- Use readonly for immutable data
- Use enums instead of string/int constants
- Use match instead of switch for value mapping
- Use named arguments for clarity with many-parameter functions
- Use `#[\Override]` when overriding parent methods
- Follow PSR-12 coding style

Fetch php.net docs for exact syntax and behavior of new features before using them.

