W3docs

__halt_compiler()

En este artículo nos centramos en la construcción del lenguaje PHP __halt_compiler(): qué es, cómo funciona y ejemplos de uso.

En este artículo nos centraremos en la construcción del lenguaje __halt_compiler() de PHP. Te ofreceremos una visión general de la construcción, cómo funciona y ejemplos de su uso.

Introducción a la construcción __halt_compiler()

La construcción del lenguaje __halt_compiler() es una característica única y poderosa de PHP. Permite incrustar datos directamente en el código PHP. Estos datos pueden ser de cualquier tipo, incluido texto, datos binarios o incluso un script completo.

Cuando el intérprete PHP encuentra la construcción __halt_compiler() en el código, detiene el analizador PHP y trata todo lo que viene después de la llamada como datos sin procesar. Esto significa que puedes incrustar cualquier tipo de dato en tu código y acceder a él posteriormente como una cadena o datos binarios.

__halt_compiler() es una construcción del lenguaje, no una función regular, por lo que se llama sin argumentos y no devuelve ningún valor. Se utiliza con mayor frecuencia para crear herramientas de un solo archivo donde el código y los datos se distribuyen juntos — por ejemplo, archivos autoextraíbles (el formato PHAR de PHP utiliza exactamente esta técnica) o instaladores que llevan su propio contenido.

Cómo usar la construcción __halt_compiler()

La construcción __halt_compiler() es muy fácil de usar. Simplemente llámala en tu código PHP, seguida de los datos que deseas incrustar. A continuación se muestra un ejemplo:

¿Cómo usar la construcción __halt_compiler()?

php— editable, runs on the server

En este ejemplo, tenemos un script PHP simple que imprime texto usando la construcción echo. Luego llamamos a la construcción __halt_compiler() e incrustamos algunos datos sin procesar después de ella. Cuando el intérprete PHP encuentra la construcción __halt_compiler(), detiene el analizador y trata todo lo que viene después como datos sin procesar.

Acceder a los datos incrustados con __COMPILER_HALT_OFFSET__

Cuando un archivo contiene __halt_compiler(), PHP define una constante especial, __COMPILER_HALT_OFFSET__, que almacena la posición en bytes del primer carácter después de la llamada. Esta es la forma canónica y más rápida de leer el contenido incrustado desde el mismo archivo — no necesitas buscar el marcador en el archivo por tu cuenta.

Leer datos incrustados desde el mismo archivo

<?php
// File: bundle.php
echo "Reading the embedded payload...\n";

// Open this very file and jump straight to the data.
$fp = fopen(__FILE__, 'rb');
fseek($fp, __COMPILER_HALT_OFFSET__);
$data = stream_get_contents($fp);
fclose($fp);

echo $data;

__halt_compiler();
Hello from the embedded data!

Aquí __COMPILER_HALT_OFFSET__ apunta al byte inmediatamente después de __halt_compiler();, por lo que nos posicionamos en él y leemos todo lo que sigue como el contenido sin procesar. La constante solo existe en un archivo que realmente contiene la construcción.

Acceder a los datos incrustados desde otro archivo

Si necesitas leer el contenido desde un archivo diferente, la constante __COMPILER_HALT_OFFSET__ de ese archivo no está disponible, por lo que debes localizar el marcador manualmente con strpos() y extraer los datos con substr() después de cargarlos mediante file_get_contents().

A continuación se muestra un ejemplo de cómo leer los datos incrustados desde un script separado:

Acceder a los datos incrustados en PHP

<?php
// File: embed.php
echo "This is some PHP code.";
__halt_compiler();
This is some raw data.
?>
<?php
// File: extract.php
// Read the script file and extract the data
$content = file_get_contents('embed.php');
$pos = strpos($content, '__halt_compiler();');
if ($pos !== false) {
    $offset = $pos + strlen('__halt_compiler();');
    $data = substr($content, $offset);
    echo $data;
}
?>

En este ejemplo, primero creamos un archivo con datos incrustados. Luego usamos un script separado para leer el archivo original y extraer los datos localizando el marcador __halt_compiler(); y calculando el desplazamiento. Finalmente, imprimimos los datos extraídos usando la construcción echo.

Nota: La constante __COMPILER_HALT_OFFSET__ solo está definida dentro del archivo que realmente contiene __halt_compiler(). Al leer un archivo diferente, strpos() devuelve false si el marcador no está presente, por lo que siempre verifica la posición con una comprobación !== false antes de calcular el desplazamiento.

Restricciones y aspectos a tener en cuenta

Ten en cuenta estas reglas al usar __halt_compiler():

  • Debe llamarse en el nivel superior de un archivo. No puedes colocarla dentro de una función, método, condicional, bucle ni ningún otro bloque. Hacerlo es un error fatal.
  • Una sola vez por archivo. Un archivo puede contener __halt_compiler() únicamente una vez — marca un único punto de corte.
  • Todo lo que sigue se ignora como código. La etiqueta de cierre ?> (si está presente) y todo lo posterior a la llamada se trata como bytes sin procesar, nunca se analiza. Por eso normalmente se omite el ?> final y se deja que los datos sigan directamente.
  • No es una función. No puedes obtener su dirección, pasarla como callback ni llamarla dinámicamente.

Conclusión

En conclusión, la construcción del lenguaje __halt_compiler() es una característica poderosa y flexible de PHP que permite incrustar datos directamente en el código. Al comprender cómo funciona la construcción y cómo acceder a los datos incrustados, puedes aprovechar esta característica para crear scripts PHP más potentes y flexibles. Los casos de uso prácticos más comunes incluyen archivos autoextraíbles, agrupación de activos estáticos (como CSS o JavaScript) con lógica PHP, y la creación de aplicaciones PHP de un solo archivo. Si principalmente necesitas incluir código de otros archivos en lugar de incrustar datos sin procesar, consulta include.

Práctica

Práctica
¿Qué es la función '__halt_compiler' en PHP?
¿Qué es la función '__halt_compiler' en PHP?
Was this page helpful?