Для чего __halt_compiler в PHP?

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

void __halt_compiler ( void ) 

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

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

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

Solutions Collecting From Web of "Для чего __halt_compiler в PHP?"

Предположим, у вас есть один скрипт с некоторым кодом 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(); §$"§%"§$!!(); §RW$FG$%ZDS$TSG$TSZ%U(); §$"§%"§$!!();

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

Они недавно обновили, чтобы прочитать шаблон из отдельного файла, но сначала метод 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% { } 

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

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

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