PHP 8.6 incorpora Partial Function Application (PFA). La característica se encuentra actualmente en beta. La publicación está prevista alrededor del 19 de noviembre de 2026.

PHP 8.1 introdujo First-Class Callable Syntax. Esta sintaxis convierte una función existente en un callable mediante expresiones como `trim(...)`, también utilizables con `array_map()`. No permite fijar argumentos seleccionados. PFA cubre ese caso con una expresión como `str_replace(' ', '-', ?)`, que crea un callable preparado para recibir después el valor pendiente.

Cada `?` representa exactamente un argumento que llegará en la llamada posterior. Se pueden usar varios marcadores, incluso entre argumentos posicionales o con nombre que ya estén fijados. La sintaxis mantiene un orden concreto: primero aparecen los valores posicionales y los marcadores, después los argumentos con nombre. Solo puede haber un `...` final, y debe ocupar la última posición. La elipsis deja abiertos todos los espacios de argumentos restantes.

PFA resulta útil con funciones que esperan un callable. `array_map()` puede recibir directamente `str_replace('hello', 'hi', ?)` como callback. En el ejemplo con `array_filter()`, `mode: ?` queda pendiente, `is_numeric(...)` fija el callback y `...` reserva el argumento del array para más tarde. El callable puede recibir `0` y `[1, 'a', 2, 'b', 3]` por posición, o `mode: 0` y `array: [1, 'a', 2, 'b', 3]` con nombres.

`...` también permite diferir la ejecución. Un callable creado con `printf('Hello, %s!' . PHP_EOL, ...)` se puede ejecutar cuando haga falta. Con el operador pipe, `str_replace(' ', '-', ?)` recibe el valor producido por la etapa anterior. El mecanismo funciona con métodos estáticos y de instancia. Los ejemplos usan `Book::create(category: Category::THRILLER, title: ?)` y `$book->publish(new DateTimeImmutable(), ...)`.

Los argumentos fijos se evalúan cuando se crea el callable parcial. En el ejemplo con `getPrefix()`, la función muestra `Called!`, devuelve `PHP` y se ejecuta de inmediato. Ese valor queda capturado para llamadas posteriores como `$partial('Alice')` y `$partial('Bob')`. Una closure normal evalúa una expresión como `getPrefix()` cada vez que se invoca.

PFA crea una nueva closure. Los metadatos del callable original no se conservan por completo. Los atributos personalizados, como `#[MyAttribute]`, se pierden. `#[NoDiscard]` y `#[SensitiveParameter]` son excepciones. `#[SensitiveParameter]` se mantiene cuando su parámetro permanece abierto. El código que use Reflection debe tener en cuenta esta diferencia. El artículo también señala que algunas construcciones especiales no son compatibles, pero no las enumera.