haphpiness

These are things in PHP which make me genuinely_happy();

First-Class Callable Syntax

PHP 8.1 introduced a clean way to create closures from existing functions and methods using the (...) syntax. No more string-based function references, no more Closure::fromCallable().

// Before: strings as callables — no static analysis, no autocompletion
$lengths = array_map('strlen', $strings);           // String reference
$filtered = array_filter($items, [$this, 'isValid']); // Array reference

// After: real, type-safe callable references
$lengths = array_map(strlen(...), $strings);
$filtered = array_filter($items, $this->isValid(...));

// Works with static methods, named functions, everything:
$encoder = json_encode(...);
$sorter = strcmp(...);
$validator = Validator::validate(...);

// They're real Closures — you can pass, store, and compose them:
$pipeline = array_reduce(
    [trim(...), strtolower(...), htmlspecialchars(...)],
    fn($carry, $fn) => fn($x) => $fn($carry($x)),
    fn($x) => $x,
);

First-class callables are proper Closure objects that IDEs can analyze, static analyzers can check, and refactoring tools can rename. They make PHP's functional capabilities genuinely first-class.

Significance: Composability

String-based callables were PHP's weakest link in functional programming: unanalyzable, unrenamable, and error-prone. First-class callables bring PHP in line with languages where functions are values, enabling safer and more composable code.