From 64504279d0fd66bfe340f52d08980b7d845413d0 Mon Sep 17 00:00:00 2001 From: Jeroen De Dauw Date: Wed, 15 Feb 2012 19:39:42 +0000 Subject: [PATCH] follow up to r111468 - put in compatibility for php 5.2 using debug_backtrace hack --- includes/DBTable.php | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/includes/DBTable.php b/includes/DBTable.php index ea627eb09f..ff29ab4f39 100644 --- a/includes/DBTable.php +++ b/includes/DBTable.php @@ -540,12 +540,43 @@ abstract class DBTable { static $instance; if ( !isset( $instance ) ) { - $instance = new static; + $class = function_exists( 'get_called_class' ) ? get_called_class() : self::get_called_class(); + $instance = new $class; } return $instance; } + /** + * Compatibility fallback function so the singleton method works on PHP < 5.3. + * Code borrowed from http://www.php.net/manual/en/function.get-called-class.php#107445 + * + * @since 1.20 + * + * @return string + */ + protected static function get_called_class() { + $bt = debug_backtrace(); + $l = count($bt) - 1; + $matches = array(); + while(empty($matches) && $l > -1){ + $lines = file($bt[$l]['file']); + $callerLine = $lines[$bt[$l]['line']-1]; + preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l--]['function'].'/', + $callerLine, + $matches); + } + if (!isset($matches[1])) $matches[1]=NULL; //for notices + if ($matches[1] == 'self') { + $line = $bt[$l]['line']-1; + while ($line > 0 && strpos($lines[$line], 'class') === false) { + $line--; + } + preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches); + } + return $matches[1]; + } + /** * Get an array with fields from a database result, * that can be fed directly to the constructor or -- 2.20.1