PHP 5.4.36 Released

__halt_compiler

(PHP 5 >= 5.1.0)

__halt_compiler Beendet die Kompilerausführung

Beschreibung

void __halt_compiler ( void )

Beendet die Kompilerausführung. Dies kann sinnvoll sein, wenn Daten in PHP-Skripte eingebettet sind, wie z.B. in Installationsdateien.

Die Byteposition, an der die Daten beginnen, kann über die Konstante __COMPILER_HALT_OFFSET__ ermittelt werden, die nur definiert ist, wenn die Funktion __halt_compiler() in der Datei benutzt wird.

Rückgabewerte

Es wird kein Wert zurückgegeben.

Beispiele

Beispiel #1 Ein __halt_compiler()-Beispiel

<?php

// Datei öffnen
$fp fopen(__FILE__'r');

// Auf den Anfang der Daten positionieren
fseek($fp__COMPILER_HALT_OFFSET__);

// und diese ausgeben
var_dump(stream_get_contents($fp));

// hier Kompilation beendenn
__halt_compiler(); ab hier die eigentlichen Daten (z.BtargzPHPetc.)

Anmerkungen

Hinweis:

__halt_compiler() kann nur auf der höchsten Ausführungsebene und nicht innerhalb anderer Funktionen oder Methoden benutzt werden.

add a note add a note

User Contributed Notes 7 notes

up
17
-T-
1 year ago
What zsh mentioned six years ago: "Also, it cannot be used in eval() -- it won't throw a syntax error, but it won't do anything either." is wrong. It can be used in eval() -- it will halt the eval.
up
5
ravenswd at gmail dot com
4 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:

<?php
if ( $something ):
  print
'something';
endif;  
// endif placed here for debugging purposes
__halt_compiler();
endif;  
// original location of endif -- would produce syntax error if __halt_compiler was not there
?>
up
1
Krzysiek
5 months 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...
up
1
joey at gimo dot co dot uk
6 months 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 ();.
up
-2
zsh
7 years ago
__halt_compiler() is a language construct and therefore cannot be used as a variable function.

Also, it cannot be used in eval() -- it won't throw a syntax error, but it won't do anything either.
up
-7
Anonymous
1 year ago
This is not what people expect to see on manual pages, don't take this as example.
up
-36
Ultimater at gmail dot com
5 years ago
Another possible usage, in addition to binary data and installers,
is using it to separate model, view and controller logic from one another:

<?php
class viewhelper{function render(){
eval(
file_get_contents(__FILE__,null,null,__COMPILER_HALT_OFFSET__));
}}

//database logic goes here
$row=array(
'loggedin'=>true,
'modcp'=>true,
'admincp'=>false,
'username'=>'Ultimater',
'userid'=>1234
);
//database logic goes here

//controller logic goes here
$view=new viewhelper;
$view->title="Test -> Ultimater's MVC example";
$view->base="http://".$_SERVER['HTTP_HOST'];
$view->username=$row['username'];
$view->userid=$row['userid'];
$view->authbar->loggedin=$row['loggedin'];
$view->authbar->modcp=$row['modcp'];
$view->authbar->admincp=$row['admincp'];
$view->render();
//controller logic goes here

__halt_compiler();?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?=htmlentities($this->title)?></title>
<style type="text/css">
a{color:#3333ff;text-decoration:none;}
a:hover{color:#0380fc;}
</style>
</head>
<body>
<?php
if($this->authbar->loggedin){
?>
<table><tr>
<td>Hello <a href="<?=$this->base?>/showuser.php?id=<?=$this->userid?>
"><?=htmlentities($this->username)?></a></td><td>[</td>
<td><a href="<?=$this->base?>/logout.php">Log Out</a></td>
<th><a href="<?=$this->base?>/usercp.php">UserCP</a></th>
<? if($this->authbar->modcp){ ?>
<td>&middot;</td><th><a href="<?=$this->base?>/modcp.php">ModCP</a></th>
<? } ?>
<? if($this->authbar->admincp){ ?>
<td>&middot;</td><th><a href="<?=$this->base?>/admincp.php">AdminCP</a></th>
<? } ?>
<td>]</td>
</tr></table>
<?php
}else{
?>
<table><tr><td>Hello Guest</td><td>[</td>
<td><a href="<?=$this->base?>/login.php">Log In</a></td>
<th><a href="<?=$this->base?>/register.php">Register</a></th>
<td>]</td></tr></table>
<? } ?>
</body>
</html>
To Top