PHP中的__halt_compiler是什么?
从手册 :
void __halt_compiler ( void )
这个函数暂停编译器的执行。 将数据embeddedPHP脚本(如安装文件)可能会很有用。
注意:
__halt_compiler()
只能从最外层的范围使用。
任何人都可以提供一个实际情况下,这个function是有用的
假设你有一个脚本,一些PHP代码和大量的二进制混乱。
<?php doStuff(); __halt_compliler(); [BIG_BINARY_MESS]
那么你希望编译器不要试图parsing二进制文件,因为如果有<?
在二进制文件的某个地方它会破坏。
关键是能够只用二进制数据和php代码发送一个文件。
有一个小例子可以看这篇博文
所以你不仅要停止脚本的execution
(如exit()
会),而是要停止parsing
以便在文件的末尾可以有“无效的语法”,php仍然可以执行第一部分。
另一个例子:
这将被parsing为有效的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(); §$"§%"§$!!();
以前, PhpSpecunit testing库中的ClassGenerator提供了一个使用__halt_compiler()
的好例子,其中PHP类包含PHP类的代码模板 。
他们最近更新了从单独的文件中读取模板,但最初getTemplate()
方法将尝试读取__halt_compiler()
调用之后的文件中提供的PHP代码模板。 这样可以避免parsing<?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函数的长文件。 其中许多目前不是有效的,但可能很快就会被要求。 我想禁用它们,但不能完全删除它们。 我希望代码保持对所有开发人员可见,以便他们可以在需要时恢复代码。 也有人通过grepsearch仍然会find代码。
所以我把代码移到文件末尾,并想“注释掉”。 但是函数本身有注释。所以我需要在每个块注释结束后,在原始代码中开始一个新的块注释。 __halt_compiler(); 做这项工作,而不改变任何其他线路。
(如果我删除了代码并将其提交给版本控制系统,那么确实可以恢复代码,但除非他们新开始查看,否则对其他开发人员将不可见)。