Из руководства :
void __halt_compiler ( void )
Эта функция останавливает выполнение компилятора. Это может быть полезно для встраивания данных в PHP-скрипты, например, в файлы установки.
Примечание:
__halt_compiler()
может использоваться только из самой внешней области.
- Синхронизированные функции с использованием PHP
- Вызов функции PHP каждую секунду
- Получение exif-данных из php
- AWS Cloudfront + Load Balancer, url изменяется с основного домена на субдомен балансировки нагрузки
- PHP: «встречается некорректное числовое число»
- Как решить ошибку JSON_ERROR_UTF8 в php json_decode?
Может ли кто-нибудь предоставить фактический случай, когда эта функция полезна?
Предположим, у вас есть один скрипт с некоторым кодом 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 (); делает работу без изменения каких-либо других строк.
(Если я удалю код и зафиксирую его в системе управления версиями, это позволит мне восстановить код, но это не будет видно другим разработчикам, если они не будут выглядеть новыми.)