Expresiones regulares PCRE utilizando subrutinas de patrones con nombre

Estoy experimentando con las características regex nombradas subpattern / ‘subrutina’ en PCRE de PHP y espero que alguien pueda explicar la siguiente salida extraña:

$re = "/ (?(DEFINE) (? a ) ) ^(?&a)$ /x"; var_dump(preg_match($re, 'a', $match)); // (int) 1 as expected var_dump($match); // Array( [0] => 'a' ) <-- Why? 

No puedo entender por qué el grupo llamado “a” no está en el resultado (con el contenido “a”). Cambiar preg_match a preg_match_all coloca “a” y “1” en los datos de coincidencia, pero ambos contienen solo una cadena vacía.

Realmente me gusta la idea de escribir expresiones regulares de esta manera, ya que puedes hacer que sean increíblemente potentes y mantenerlas muy fáciles de mantener (mira esta respuesta para ver un buen ejemplo de esto), sin embargo, si los subpatrones no están disponibles en los datos del partido, entonces no es mucho uso realmente.

¿Me estoy perdiendo algo aquí o debería simplemente llorar lo que podría haber sido y seguir adelante?

Tiene mucho sentido que estos subpatrones no capturen un grupo; su objective principal es que se utilicen más de una vez, por lo que no se pueden capturar todos. Además, si el valor predeterminado fuera capturar todos los subpatrones, no le daría la opción de no capturar un grupo donde no lo desea, no es el mejor comportamiento predeterminado. Lo contrario es trivial: puedes capturar agregando otro grupo alrededor de la statement (?&a) .
No pude encontrar una referencia a esto en PCRE.org . Lo más cercano es esto, que es relevante porque no coincide (?...) directamente (aunque podría esperar un grupo vacío):

Cualquier paréntesis de captura que se establezca durante la llamada de subrutina volverá a sus valores anteriores después.

Está más claro en el manual de Perl (resaltada la parte relevante):

Un ejemplo de cómo esto podría ser utilizado es el siguiente:

 /(?(?&NAME_PAT))(?(?&ADDRESS_PAT)) (?(DEFINE) (?....) (?....) )/x 

Tenga en cuenta que los búferes de captura coincidentes dentro de la recursión no son accesibles después de que la recursión regrese , por lo que es necesaria la capa adicional de captura de búferes.