Funciones en el Zend Core

Cuando PHP arranca, registra todas las funciones definidas en las extensiones en estructuras del tipo:

typedef struct _zend_internal_function {
   /* Common elements */
   zend_uchar type;
   zend_uchar *arg_types;
   char *function_name;
   zend_class_entry *scope;
   zend_uint fn_flags;
   union _zend_function *prototype;
   /* END of common elements */
   void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
} zend_internal_function;

Son importantes type ( que siempre es ZEND_INTERNAL_FUNCTION, lo que significa que es una extensión escrita en C), function name, y handler, que es un puntero C a la función en si y parte del código de la extensión.

Por otra parte las funciones definidas por el usuario son compiladas y registradas en una tabla global usando una unión:

typedef union _zend_function {
    zend_uchar type;
    struct {
      zend_uchar type; /* never used */
      zend_uchar *arg_types;
      zend_class_entry *scope;
      zend_uint fn_flags;
      union _zend_function *prototype;
    } common;
    zend_op_array op_array;
    zend_internal_function internal_function;
} zend_function;

Ambas, zend_functions y zend_internal_functions no son estructuras idénticas, pero comparten elementos en común que permiten transformar una en otra.