Login   Register  
PHP Classes
elePHPant
Icontem

File: ArrayOfGenericLoader.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Martin Alterisio  >  Generic Array  >  ArrayOfGenericLoader.php  >  Download  
File: ArrayOfGenericLoader.php
Role: Class source
Content type: text/plain
Description: Array generic class loader
Class: Generic Array
Create arrays that allow members of just one type
Author: By
Last change: Access without login.
Date: 7 years ago
Size: 2,742 bytes
 

Contents

Class file image Download
<?php
/**
 * @package genericarray
 */

/**
 * Generic array loader. Singleton.
 */
final class ArrayOfGenericLoader {
    private static 
$instance;
    
    const 
PREFIX 'ArrayOf';
    
    public static function 
getInstance() {
        if (!
self::$instance) {
            
self::$instance = new ArrayOfGenericLoader();
        }
        return 
self::$instance;
    }
    
    public 
$cachedir;
    
    private function 
__construct() {
        
$this->cachedir dirname(__FILE__) . '/cache';
    }
    
    public function 
loadClass($classname) {
        if (
substr($classname0strlen(self::PREFIX)) != self::PREFIX) return false;
        if (
$this->inCache($classname)) {
            
$this->loadFromCache($classname);
            return 
true;
        }
        
$this->createGeneric($classname);
        return 
true;
    }
    
    private function 
inCache($classname) {
        if (!
file_exists($this->cachedir '/check.' $classname '.php')) return false;
        if (!
file_exists($this->cachedir '/' $classname '.php')) return false;
        return require(
$this->cachedir '/check.' $classname '.php');
    }
        
    private function 
loadFromCache($classname) {
        require_once 
$this->cachedir '/' $classname '.php';
    }
            
    private function 
createGeneric($classname) {
        
$genericClass = new ReflectionClass(self::PREFIX 'GenericX');
        
$genericFile $genericClass->getFileName();
        
$genericX substr($classnamestrlen(self::PREFIX));
        
        
$tokens token_get_all(file_get_contents($genericFile));
        
$code '';
        foreach (
$tokens as $token) {
            if (
is_array($token)) {
                if (
$token[0] == T_STRING) {
                    
$token[1] = str_replace('GenericX'$genericX$token[1]);
                } else if (
$token[0] == T_COMMENT || $token[0] == T_DOC_COMMENT) {
                    
$token[1] = str_replace('GenericX'$genericX$token[1]);
                }
                
$code .= $token[1];
            } else {
                
$code .= $token;
            }
        }
        
        
$checkCode  "<?php\n";
        
$checkCode .= "if (filemtime('" addcslashes($genericFile"'\\") . "') > filemtime(__FILE__)) {\n";
        
$checkCode .= "    return false;\n";
        
$checkCode .= "}\n";
        
$checkCode .= "return true;\n";
        
        
file_put_contents($this->cachedir '/check.' $classname '.php'$checkCode);
        if (
file_put_contents($this->cachedir '/' $classname '.php'$code)) {
            
$this->loadFromCache($classname);
        } else {
            eval(
"?>$code");
        }
    }
}
?>