Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Created functions to make possible to create static methods on models #182

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 57 additions & 1 deletion core/MY_Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -937,4 +937,60 @@ protected function _return_type($multi = FALSE)
$method = ($multi) ? 'result' : 'row';
return $this->_temporary_return_type == 'array' ? $method . '_array' : $method;
}
}

/**
* Return the class name of the current call
* @param boolean $bt
* @param integer $l
* @return type
*/
static function get_called_class($bt = false, $l = 1) {
if (!$bt) $bt = debug_backtrace();
if (!isset($bt[$l])) throw new Exception("Cannot find called class -> stack level too deep.");
if (!isset($bt[$l]['type']))
throw new Exception ('type not set');
else switch ($bt[$l]['type']){
case '::':
$lines = file($bt[$l]['file']);
$i = 0;
$callerLine = '';
do{
$i++;
$callerLine = $lines[$bt[$l]['line']-$i] . $callerLine;
} while (stripos($callerLine,$bt[$l]['function']) === false);
preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/', $callerLine, $matches);
if (!isset($matches[1]))
throw new Exception ("Could not find caller class: originating method call is obscured.");
switch ($matches[1]){
case 'self':
case 'parent':
return self::get_called_class($bt,$l+1);
default:
return $matches[1];
}
case '->': switch ($bt[$l]['function']){
case '__get':
if (!is_object($bt[$l]['object'])) throw new Exception ("Edge case fail. __get called on non object.");
return get_class($bt[$l]['object']);
default: return $bt[$l]['class'];
}
default: throw new Exception ("Unknown backtrace method type");
}
}

/**
* This will keep a instance of the current class to be used on static methods, like singleton
* @var Current_class
*/
private static $_instance;

/**
* Return a instance of the current class to be used on static methods
* @return class_instance
*/
static function getInstance(){
if (self::$_instance == null)
eval("self::\$_instance = new ".(self::get_called_class())."();");
return self::$_instance;
}
}