Для чего нужен __halt_compiler в PHP? - PullRequest
44 голосов
/ 11 марта 2011

Из руководства :

void __halt_compiler ( void )

Эта функция останавливает выполнение компилятора. Это может быть полезно для встраивания данных в сценарии PHP, например, в установочные файлы.

Примечание: __halt_compiler() может использоваться только из самой внешней области видимости.

Кто-нибудь может привести пример, когда эта функция полезна?

Ответы [ 3 ]

56 голосов
/ 11 марта 2011

Предположим, у вас есть один скрипт с небольшим количеством php-кода и множеством бинарных беспорядков.

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

тогда вы хотите, чтобы компилятор НЕ пытался проанализировать двоичный файл, потому что если в двоичном файле есть <?, он сломается.

Точка в состоянии отправить один файл с двоичными данными и кодом php.

Для небольшого примера смотрите это сообщение в блоге


Таким образом, вы хотите не только остановить execution скрипта (как это сделал бы exit()), но и остановить parsing, чтобы вы могли иметь «недопустимый синтаксис» в конце файла и php по-прежнему мог выполняться первая часть.


Другой пример:

Это будет проанализировано как действительный php и выполнится просто отлично:

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

Для доступа к данным:

<?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(); §$"§%"§$!!();

Это выдаст §RW$FG$%ZDS$TSG$TSZ%U(); §$"§%"§$!!();

7 голосов
/ 05 июля 2014

Ранее ClassGenerator в библиотеке модульного тестирования PhpSpec предоставил хороший пример использования __halt_compiler(), в котором класс PHP * содержит шаблон кода для класса PHP . * 1006. *

Они недавно обновились, чтобы прочитать шаблон из отдельного файла, но первоначально метод getTemplate() попытается прочитать шаблон кода PHP, предоставленный в файле, который следует за вызовом __halt_compiler(). Это позволяет избежать разбора токена <?php.

/**
 * 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%
{
}
3 голосов
/ 19 марта 2015

Вот еще одно возможное использование.У меня есть длинный файл функций PHP.Многие из них в настоящее время не действительны, но могут потребоваться в ближайшее время.Я хочу отключить их, но не полностью удалить их.Я хочу, чтобы код оставался видимым для всех разработчиков, чтобы они могли восстановить код, если им это нужно.Также любой, кто ищет через grep, все равно найдет код.

Так что я перемещаю код в конец файла и хочу «закомментировать» его.Однако в самих функциях есть комментарии. Поэтому мне нужно начинать новый комментарий блока после конца каждого комментария блока в исходном коде.__HALT_COMPILER ();выполняет работу без изменения каких-либо других строк.

(Если я удаляю код и фиксирую его в системе управления версиями, это позволяет мне восстановить код, но он не будет виден другим разработчикам, если толькоони новые на вид.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...