Hi. I just made a php "compiler" class and I fell to share it. By compiler, I mean a class which will merge all files into one, removing comments, unwanted spaces and unwanted carriage-return. It it very usefull if you always include/require a lot of files to increase speed.

here's the class :
PHP Code:
<?php
// +---------------------------------------------------------------------------+
// | Framework for Php4                                                        |
// |---------------------------------------------------------------------------+
// | Author : Jean-Philippe Déry <jeanphilippe_dery@hotmail.com>               |
// +---------------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify      |
// | it under the terms of the GNU General Public License as published by      |
// | the Free Software Foundation; either version 2 of the License, or         |
// | (at your option) any later version.                                       |
// +---------------------------------------------------------------------------+

define('ROOT''../');
define('LINEBREAK'"\n");
define('BRACKET_ON_SAME_LINE'1);

/**
 * "Compiler" Class. This class reads all files from a directory and merge them
 * into a big one. Very usefull to get some speed if, in each pages, you
 * include a lot of differents files.
 *
 * @author  Jean-Philippe Déry <jeanphilippe_dery@hotmail.com>
 * @version 1.0
 */
class Compiler
{
    
/**
     * Compile each files from this directory.
     *
     * @type   string
     * @access private
     * @since  1.0
     */
    
var $dir  'lib/';
    
    
/**
     * Compiled file.
     *
     * @type   string
     * @access private
     * @since  1.0
     */
    
var $file 'include/all.php';

    
/**
     * Constructeur. Compile
     *
     * @access public
     * @since  1.0
     */
    
function Compiler()
    {
        
$this->compile();    
    }
    
    
/**
     * Compile all files into a single one
     *
     * @access private
     * @since  1.0
     */
    
function compile()
    {
        
$this->file ROOT $this->file;
        
$this->dir  ROOT $this->dir;
        
        
$files '';
        
        
// Reads all files
        
if (!$dp opendir($this->dir))
        {
            
trigger_error('Cannot open directory ' $this->dir);        
        }
        
        while (
$file readdir($dp))
        {
            if ((
$file != '..') && ($file != '.') && (!is_dir($this->dir $file)))
            {
                echo 
'<code>Compile file ' $file ' ';
                
                
$filelines file($this->dir $file);
                
                
// Remove end of line comments 
                
foreach ($filelines as $i => $line)
                {
                    
$filelines[$i] = trim($filelines[$i]);
                    
$filelines[$i] = preg_replace('/\/\/.*$/m'''$line);
                    
                    if (
$i 10 == 0)
                    {
                        echo 
'.';
                    }
                }
                                            
                
$files .= implode(''$filelines);

                echo 
' <b>done</b><br>';
            }
        }

        @
closedir($dp);
        
        
// Remove php tags
        
$files str_replace('<?php'''$files);
        
$files str_replace('?>'''$files);
        
        
// Remove block comments
        
$files preg_replace('/\/\*(.*?)\*\//s'''$files);
        
        
// Remove unwanted \n        
        
$files preg_replace("/(\r\n)+/s""\n"$files);
        
$files preg_replace("/((\r\n)+(\t)+(\r\n)+)/s""\n"$files);
        
$files preg_replace("/((\r\n)+(\s)+(\r\n)+)/s""\n"$files);

        
$files preg_replace("/(\n)+/s""\n"$files);
        
$files preg_replace("/((\n)+(\t)+(\n)+)/s""\n"$files);
        
$files preg_replace("/((\n)+(\s)+(\n)+)/s""\n"$files);
        
        if (
defined('BRACKET_ON_SAME_LINE'))
        {
            
$files preg_replace("/(\n)+(\s)*\{/s""{"$files);
            
$files preg_replace("/(\r\n)+(\s)*\{/s""{"$files);
        }
        
        
// Remove unwanted spaces
        
$files preg_replace("/( )+/s"" "$files);
        
        
// Compiled files' header
        
$files '<?php' LINEBREAK .                  
                 
'// This is a generated files which contains all files from ' $this->dir LINEBREAK .
                 
'// Compiled for a speed issue ' LINEBREAK .
                 
'// Do not edit this file. Instead, edit the file into ' $this->dir ' and recompile all' LINEBREAK .
                 
$files LINEBREAK .
                 
'?>';
        
        
// Put all files into a single one
        
if (!$fp fopen($this->file'w+'))
        {
            
trigger_error('Cannot open file ' $this->file);
        }
        
        
fwrite($fp$filesstrlen($files));
        
fclose($fp);
        
        
// Finished
        
echo '<h5 style="font-family : Verdana">Compilation succeeded</h5>';
    }
}

// Compile
$compiler =& new Compiler();

?>
How to use it :

1. Change the ROOT constant value to your root relative path.
2. Edit the dir attribute to your lib directory.
3. Edit the file attribute to the file which will contain all classes.

Here's the result:
Before
PHP Code:
    /**
     * Compile et retourne le code html compilé.
     *
     * @return string Le code qui vient d'être compilé.
     *
     * @access public
     * @since  1.0
     */
    
function parse()
    {
        
$template $this->uncompiled;

        
// Pré-compilation
        
$this->preParse($template);
        
        
// Compile les mots
        
$this->parseLang($template);
        
        
// Compile les variables simples
        
foreach ($this->vars as $handle => $value)
        {
            
$template str_replace('{' $handle '}'$value$template);
        }
        
        
// Toute les définitions et les remplacements sont stoqués dans des
        // tableau pour simplement tous les passer dans str_replace question
        // de gagner de la rapidité
        
$defs = array();
        
$repl = array();        
        
        
// Compile uniquement les bloques qui ont eut des variables assignées
        
foreach ($this->blockVars as $name => $instances)
        {
            
// Cherche un bloque qui a comme nom le contenu de $name et retourne
            // sa définition et le contenu du code.
            
if ($this->getBlock($template$name$def$code))
            {
                
// Liste des instances du bloque compilée
                
$list = array();
                
                
$size sizeof($instances);
                
                
// Compile toute les instances du bloque
                
for ($i 0$i $size$i++)
                {
                    
$list[$i] = $code;

                    foreach (
$instances[$i] as $handle => $value)
                    {
                        
$list[$i] = str_replace('{' $name '.' $handle '}'$value$list[$i]);
                    }
                }
                
                
$defs[] = $def;
                
$repl[] = implode(''$list);
            }
        }

        
// Remplace toutes des définitions de bloque par leur remplacements
        // c'est à dire leur remplacement compilés
        
$template str_replace($defs$repl$template);

        
$this->clean($template);
        
$this->reset();

        return 
$template;
    } 
After

PHP Code:
function parse(){
        
$template $this->uncompiled;
        
$this->preParse($template);
        
$this->parseLang($template);
        foreach (
$this->vars as $handle => $value){
            
$template str_replace('{' $handle '}'$value$template);
        }
        
$defs = array();
        
$repl = array();        
        foreach (
$this->blockVars as $name => $instances){
            if (
$this->getBlock($template$name$def$code)){
                
$list = array();
                
$size sizeof($instances);
                for (
$i 0$i $size$i++){
                    
$list[$i] = $code;
                    foreach (
$instances[$i] as $handle => $value){
                        
$list[$i] = str_replace('{' $name '.' $handle '}'$value$list[$i]);
                    }
                }
                
$defs[] = $def;
                
$repl[] = implode(''$list);
            }
        }
        
$template str_replace($defs$repl$template);
        
$this->clean($template);
        
$this->reset();
        return 
$template;
    } 
Fell free to post any comments