PHP 8.4 TypeError and ArgumentCountError Playbook: What Breaks and How to Fix It
These articles are AI-generated summaries. Please check the original sources for full details.
PHP 8.4 TypeError and ArgumentCountError Playbook: What Breaks and How to Fix It
PHP 8.4 introduces a major shift in error handling by converting lenient E_WARNING messages into hard-throwing exceptions. Code that previously functioned with warnings, such as calling count() on null, will now cause applications to fatally crash.
Why This Matters
The technical reality is that many legacy PHP applications rely on loose behaviors where invalid operations fail silently or with logged warnings. PHP 8.4 enforces a stricter model that prioritizes type safety over backward compatibility, potentially breaking thousands of Drupal modules and WordPress plugins that pass unvalidated data to internal functions. This shift requires engineers to move from passive error logging to active type validation to maintain uptime.
Key Insights
- PHP 8.4 converts count(null) from an E_WARNING returning 0 into a fatal TypeError, breaking legacy loop logic.
- Arithmetic or bitwise operations on arrays and objects now throw TypeError instead of issuing a warning and returning null.
- Illegal string offsets and invalid types passed to exit() or die() are now strictly enforced via TypeError.
- PHPStan (level max) and Psalm (level 1) are recommended as primary tools for identifying these breaking changes before deployment.
- Drupal 12 will require PHP 8.4 as its minimum version, forcing a massive ecosystem-wide audit of contributed modules.
Working Examples
Safe count() implementation for PHP 8.4 to avoid TypeError on null values.
$value = null;
if (is_countable($value)) {
$count = count($value);
} else {
$count = 0;
}
Correcting invalid arithmetic operations on arrays.
$items = [1, 2];
$items[] = 1; // Correct way to append
// Arithmetic like $items + 1 now throws TypeError
Practical Applications
- Drupal and WordPress Ecosystems: Plugin developers must add PHP 8.4 to CI test matrices to catch unvalidated query results being passed to count().
- Static Analysis Integration: Run vendor/bin/phpstan analyse src/ —level=max to identify invalid types passed to core functions.
- Legacy Code Audits: Use grep patterns like ‘count($’ to locate variables that lack is_countable() guards before upgrading server environments.
- Type Hinting: Correct magic method type declarations to prevent mismatch errors during engine-level type checks.
References:
Continue reading
Next article
Building an Autonomous Agent for Dwarf Fortress: Architecture and LLM Integration
Related Content
Migrun: A Minimalist, Dependency-Injection First PHP Migration Runner
Migrun is a zero-dependency PHP migration runner designed to integrate natively with PSR-11 service containers and modern PHP 8 features.
Podium CLI: A Unified Local Development System
Podium CLI simplifies local development by enabling multiple projects—Laravel, WordPress, and more—to run consistently without Docker configuration.
Automating Policy-Gated Releases: Building SwiftDeploy for Observable DevOps
SwiftDeploy evolves into a policy-gated system using OPA to block releases if disk space is under 10GB or error rates exceed 1%.