PHP Classes

File: Manager.class.php

Recommend this page to a friend!
  Classes of TB   Manager Class   Manager.class.php   Download  
File: Manager.class.php
Role: Class source
Content type: text/plain
Description: Manager Class File
Class: Manager Class
Load classes when a function is called
Author: By
Last change:
Date: 12 years ago
Size: 7,893 bytes
 

Contents

Class file image Download
<?php
   
/**
    * Class Manager Class.
    *
    * @author Brasoveanu Tudor
    * @version 1.0 2011-10-11
    */
   
   
class Manager {
       
        private
$path;
        private
$classes = array();
        private
$data = array();
       
       
/**
        * Initialize a Manager class
        * $data allowed :
        * folderName (string) - default : classes
        * loadAll (bool) - default : false
        * debug (bool) - default : false
        *
        * @param array $data
        * @return void
        */
       
       
public function __construct($data = array()) {
           
$folderName = 'classes';
           
$loadAll = false;
           
$debug = false;
           
            if(
is_array($data) && array_key_exists('folder_name',$data))
               
$folderName = $data['folderName'];
           
            if(
is_array($data) && array_key_exists('loadAll',$data))
               
$loadAll = $data['loadAll'];
           
            if(
is_array($data) && array_key_exists('debug',$data))
               
$debug = $data['debug'];
           
            if(
file_exists($folderName) && is_dir($folderName)) {
               
$this->path = $folderName.'/';
            }
           
            if(!empty(
$this->path)) {
               
$check = $this->MapAllClasses();
                if(!
$check) die('Could not load classes or folder is empty from path : '.$this->path.'');
               
                if(
$debug) {
                    echo
'<pre>';
                   
print_r($this->classes);
                    echo
'</pre>';
                }
               
                if(
$loadAll) {
                    foreach(
$this->classes AS $class) {
                        if(!
class_exists($class['class'])) {
                            require_once(
$class['file']);
                           
$this->data[strtolower($class['class'])] = new $class['class']();
                        }
                    }
                   
                    if(
$debug) {
                        echo
'<pre>';
                       
print_r(get_declared_classes());
                        echo
'</pre>';
                    }
                }
            }
        }
       
       
/**
        * Gets the class definition object (class name,method names,class path)
        *
        * @param string $php_code
        * @param bool $onlypublic
        * @return array
        */
       
function GetPHPClasses($php_code,$onlypublic = true) {
           
$classes = array();
           
$methods=array();
           
           
$tokens = token_get_all($php_code);
           
$count = count($tokens);
           
            for (
$i = 2; $i < $count; $i++) {
                if (
$tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) {
                   
$class_name = $tokens[$i][1];
                   
$methods[$class_name] = array();
                }
               
                if (
$tokens[$i - 2][0] == T_FUNCTION && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) {
                    if (
$onlypublic) {
                        if (!
in_array($tokens[$i-4][0],array(T_PROTECTED, T_PRIVATE))) {
                           
$method_name = $tokens[$i][1];
                           
$methods[$class_name][] = $method_name;
                        }
                    } else {
                       
$method_name = $tokens[$i][1];
                       
$methods[$class_name][] = $method_name;
                    }
                }
            }
           
            return
$methods;
        }
       
       
/**
        * Gets the class definition object from a file (class name,method names,class path)
        *
        * @param string $filepath
        * @param bool $onlypublic
        * @return array
        */
       
function FileGetPHPClasses($filepath,$onlypublic=true) {
           
$php_code = file_get_contents($filepath);
           
$classes = $this->GetPHPClasses($php_code,$onlypublic);
           
            return
$classes;
        }
       
       
/**
        * Gets all the class definition objects
        * from the classes folder (class name,method names,class path)
        *
        * @param string $path
        * @param bool $onlypublic
        * @return array
        */
       
function MapAllClasses($path = '',$onlypublic = true) {
           
$result = array();
           
$return = false;
           
            if(empty(
$path))
               
$path = $this->path;
           
            if(!empty(
$path)) {
               
$dh = opendir($path);
                while ((
$file = readdir($dh)) !== false) {
                    if (
substr($file,0,1) != ".") {
                        if (
filetype($path.$file) == "file") {
                           
$classes = $this->FileGetPHPClasses($path.$file,$onlypublic);
                            foreach(
$classes as $class=>$method) {
                               
$result[] = array(
                                   
"file" => $path.$file,
                                   
"class" => $class,
                                   
"method" => $method
                               
);
                            }
                        } else {
                           
$result = array_merge($result,$this->MapAllClasses($path.$file."/",$onlypublic));
                        }
                    }
                }
               
closedir($dh);
               
                if(
is_array($result) && count($result) > 0) {
                   
$this->classes = $result;
                   
$return = true;
                }
            }
           
            return
$return;
        }
       
       
/**
        * Initialize the wanted classes
        *
        * @param string $name
        * @param bool $debug
        * @return void
        */
       
public function startClass($name = '',$debug = false) {
            if(!empty(
$name) && !class_exists($name)) {
                foreach(
$this->classes AS $class) {
                    if(
strcasecmp($class['class'],$name) == 0)
                    {
                        require_once(
$class['file']);
                       
$this->data[strtolower($class['class'])] = new $class['class']();
                       
                        if(
$debug) {
                            echo
'<pre>';
                           
print_r(get_declared_classes());
                            echo
'</pre>';
                        }
                       
                        break;
                    }
                }
            }
        }
       
       
/**
        * Runs a specified method from a class
        * Example call className_MethodName(parameters)
        *
        * @param string $function_name
        * @param bool $params
        * @return function
        */
       
public function __call($function_name, $params) {
           
$class_name = '';
           
$function = '';
           
            if(
strpos($function_name,"_")) {
                list(
$class_name,$function) = explode("_",$function_name);
               
                if (
method_exists($this->data[$class_name], $function)) {
                    return
call_user_func_array(array($this->data[$class_name], $function), $params);
                }
            } else {
                foreach(
$this->data as $class) {
                    if (
method_exists($class, $function_name)) {
                        return
call_user_func_array(array($class, $function_name), $params);
                    }
                }
            }
        }
    }
?>