PHP: Hypertext Preprocessor (original) (raw)
__halt_compiler
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
__halt_compiler — Halts the compiler execution
Description
__halt_compiler(): void
Byte position of the data start can be determined by the**[__COMPILER_HALT_OFFSET__](misc.constants.php#constant.compiler-halt-offset)
** constant which is defined only if there is a __halt_compiler() presented in the file.
Parameters
This function has no parameters.
Return Values
No value is returned.
Examples
Example #1 A __halt_compiler() example
<?php// open this file $fp = fopen(__FILE__, 'r');// seek file pointer to data fseek($fp, __COMPILER_HALT_OFFSET__);// and output it var_dump(stream_get_contents($fp));// the end of the script execution __halt_compiler(); the installation data (eg. tar, gz, PHP, etc.)
Notes
Note:
__halt_compiler() can only be used from the outermost scope.
Found A Problem?
11 years ago
This function can be used in eval() -- it will halt the eval, but not the script eval"() was called in.
14 years ago
`__halt_compiler is also useful for debugging. If you need to temporarily make a change that will introduce an error later on, use __halt_compiler to prevent syntax errors. For example:
`
9 years ago
If "__halt_compiler();" appears in a file which is "include"d or "require"d, then the called-in file will be treated as if it physically cuts off at the "__halt_compiler();". In other words, "__halt_compiler();" only affects the physical file it's in, an outer file that pulls it in will continue to execute.
10 years ago
`Joey, you're wrong saying that __halt_compiler have strange behavior. This structure works exactly the same as any other build in structure like empty or isset (even similarly to functions; at least in tokenizer level).
About T_OPEN_TAG - after one open tag is present you didn't expect other one in current php code section, so tokenizer try to handle this "thing" in other way and it's perfectly normal...
`
5 years ago
10 years ago
`I don't exactly know what PHP is doing internally but I don't understand the sanity behind how in token_get_all __halt_compiler is handled.
This is actually valid there:
__halt_compiler// // // // /** */();raw
Normally it pops off just any three tokens so you can have even __halt_compiler***, __halt_compiler))), etc in token _get all.
The weird thing is that is also skips T_OPEN_TAG but in the context __halt_compiler runs in this tag should not be posible. Instead it will pick up < and ? as operators and php as a T_STRING.
It ignores the token at any point so this is also valid:
__halt_compiler()// // // // /** */;raw
When I test this with a php file rather than the tokeniser it works the same.
I can only conclude that PHP/__halt_compiler is pretty weird.
I think this is from attempting to weakly imitate the same syntax handling as in functions (I guess you can put comments/whitespace anywhere). I find it annoying and counter productive though.
Even this is valid:
__halt_compiler// comment\n();raw
A general problem that compound matters is that tokenise wont check whether or not syntax is valid (tokens against each other). When running as PHP you must have ();.
`
cwk32 at mail dot ustc dot edu dot cn ¶
10 years ago
`if you find the value of COMPILER_HALT_OFFSET is highly strange. Maybe...
there are some complier optimization tools, like eAccelator(very old). When the program is pre-complied and cached, the COMPILER_HALT_OFFSET will be 0 = =
`