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(); 做这项工作,而不改变任何其他线路。

(如果我删除了代码并将其提交给版本控制系统,那么确实可以恢复代码,但除非他们新开始查看,否则对其他开发人员将不可见)。