You are here

get_called_class.inc in Styles 7.2

Same filename and directory in other branches
  1. 6.2 includes/php/get_called_class.inc

Add support for get_called_class() to < PHP 5.3.

File

includes/php/get_called_class.inc
View source
<?php

/**
 * @file
 *
 * Add support for get_called_class() to < PHP 5.3.
 *
 * @see http://www.php.net/manual/en/function.get-called-class.php#93799
 */

/********************************
 * Retro-support of get_called_class()
 * Tested and works in PHP 5.2.4
 * http://www.sol1.com.au/
 ********************************/
if (!function_exists('get_called_class')) {
  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])) {

            // must be an edge case.
            throw new Exception("Could not find caller class: originating method call is obscured.");
          }
          switch ($matches[1]) {
            case 'self':
            case 'parent':
              return get_called_class($bt, $l + 1);
            default:
              return $matches[1];
          }

        // won't get here.
        case '->':
          switch ($bt[$l]['function']) {
            case '__get':

              // edge case -> get class of calling object
              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");
      }
    }
  }
}