52 votes

A quoi sert __halt_compiler en PHP?

Du manuel :

 void __halt_compiler ( void )
 

Cette fonction arrête l'exécution du compilateur. Cela peut être utile pour incorporer des données dans des scripts PHP, comme les fichiers d'installation.

Remarque: __halt_compiler() ne peut être utilisé que depuis le périmètre le plus externe.

Quelqu'un peut-il fournir un cas concret dans lequel cette fonction est utile?

62voto

edorian Points 22780

Supposons que vous disposez d'un script avec certains de code php et beaucoup, beaucoup de binaire de l'encombrement.

<?php doStuff(); __halt_compliler(); [BIG_BINARY_MESS]

alors vous voulez que le compilateur de ne PAS essayer d'analyser le binaire parce que si il y a <? quelque part dans le binaire, il allait se briser.

Le point est d'arriver à juste expédier un fichier avec des données binaires et le code php.

Pour un petit exemple, voir ce post de blog


Donc, vous voulez non seulement pour arrêter l' execution d'un script (comme exit() serait) mais pour arrêter l' parsing , de sorte que vous pouvez avoir "syntaxe non valide" à la fin du fichier et php ne pouvez toujours exécuter la première partie.


Un autre exemple:

Cela permet d'obtenir des analysée comme php valide et d'exécuter parfaitement:

<?php $a = 1; echo $a; __halt_compiler(); §RW$FG$%ZDS$TSG$TSZ%U(); §$"§%"§$!!();

Pour accéder aux données:

<?php
$file = fopen(__FILE__, 'rb');
// Go to the end of the __halt_compiler();
fseek($file, __COMPILER_HALT_OFFSET__);
echo stream_get_contents($file);
__halt_compiler(); §RW$FG$%ZDS$TSG$TSZ%U(); §$"§%"§$!!();

Cela permettra de sortie §RW$FG$%ZDS$TSG$TSZ%U(); §$"§%"§$!!();

7voto

Adam Elsodaney Points 2643

Auparavant, Le ClassGenerator dans le PhpSpec tests unitaires bibliothèque a fourni un bon exemple de l'utilisation de __halt_compiler(), ce qui la classe PHP qui contient un modèle de code pour une classe PHP.

Ils ont récemment mise à jour pour lire le modèle à partir d'un autre fichier, mais au départ, l' getTemplate() méthode tente de lire le code PHP modèle fourni dans le fichier qui suit l' __halt_compiler() appel. Cela évite l' <?php jeton de se analysée.

/**
 * The Class Generator is responsible for generating the classes from a resource
 * in the appropriate folder using the template provided
 */
class ClassGenerator
{
    //...

    /**
     * @return string
     */
    protected function getTemplate()
    {
        return file_get_contents(__FILE__, null, null, __COMPILER_HALT_OFFSET__);
    }
}
__halt_compiler();<?php%namespace_block%

class %name%
{
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X