<?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);
}
}
}
}
}
?>
|