[ Index ]

PHP Cross Reference of Akelos Framework

title

Body

[close]

/ -> AkObject.php (source)

   1  <?php
   2  /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
   3  
   4  // +----------------------------------------------------------------------+
   5  // | Akelos Framework - http://www.akelos.org                             |
   6  // +----------------------------------------------------------------------+
   7  // | Copyright (c) 2002-2006, Akelos Media, S.L.  & Bermi Ferrer Martinez |
   8  // | Released under the GNU Lesser General Public License, see LICENSE.txt|
   9  // +----------------------------------------------------------------------+
  10  
  11  /**
  12   * @package ActiveSupport
  13   * @subpackage Compatibility
  14   * @author Bermi Ferrer <bermi a.t akelos c.om>
  15   * @copyright Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.org
  16   * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
  17   */
  18  
  19  if(!class_exists('AkObject')){ 
  20  
  21  /**
  22  * Allows for __construct and __destruct to be used in PHP4.
  23  *
  24  * A hack to support __construct() on PHP 4
  25  * Hint: descendant classes have no PHP4 class_name()
  26  * constructors, so this one gets called first and calls the
  27  * top-layer __construct() which (if present) should call
  28  * parent::__construct()
  29  *
  30  * @author Bermi Ferrer <bermi a.t akelos c.om>
  31  * @copyright Copyright (c) 2002-2005, Akelos Media, S.L. http://www.akelos.org
  32  * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
  33  */
  34  class AkObject
  35  {
  36  
  37  
  38      // ------ CLASS METHODS ------ //
  39  
  40  
  41  
  42  
  43      // ---- Public methods ---- //
  44  
  45  
  46      // {{{ AkObject()
  47  
  48      /**
  49      * A hack to support __construct() on PHP 4
  50      *
  51      * Hint: descendant classes have no PHP4 class_name()
  52      * constructors, so this one gets called first and calls the
  53      * top-layer __construct() which (if present) should call
  54      * parent::__construct()
  55      *
  56      * @access public
  57      * @return void
  58      */
  59      function AkObject()
  60      {
  61          Ak::profile('Instantiating '.get_class($this));
  62          $args = func_get_args();
  63          ____ak_shutdown_function(&$this);
  64          call_user_func_array(array(&$this, '__construct'), $args);
  65          ____ak_shutdown_function(true);
  66          
  67      }
  68      
  69      // }}}
  70      
  71      
  72      // {{{ toString()
  73  
  74      /**
  75      * Object-to-string conversion
  76      *
  77      * Each class can override it as necessary
  78      *
  79      * @access public
  80      * @return string in this case returns this class name
  81      */
  82      function toString()
  83      {
  84          return get_class($this);
  85      }
  86      
  87      function __toString()
  88      {
  89          return $this->toString();
  90      }
  91  
  92      // }}}
  93  
  94  
  95      // ---- Protected methods ---- //
  96  
  97  
  98      // {{{ __construct()
  99  
 100      /**
 101      * Class constructor, overriden in descendant classes
 102      *
 103      * @access protected
 104      * @return void
 105      */
 106      function __construct()
 107      {
 108  
 109      }
 110  
 111      // }}}
 112      // {{{ __destruct()
 113  
 114      /**
 115      * Class destructor, overriden in descendant classes
 116      *
 117      * @access protected
 118      * @return void
 119      */
 120      function __destruct()
 121      {
 122          unset($this);
 123      }
 124  
 125  
 126      // }}}
 127  
 128      // {{{ __clone()
 129  
 130      /**
 131      * Clone class (Zend Engine 2 compatibility trick)
 132      */
 133      function __clone()
 134      {
 135          return $this;
 136      }
 137  
 138      // }}}
 139  
 140      function log($message, $type = '', $identifyer = '')
 141      {
 142          if (AK_LOG_EVENTS){
 143              $Logger =& Ak::getLogger();
 144              $Logger->log($message, $type);
 145          }
 146      }
 147  
 148      /**
 149      * Unsets circular reference children that are not freed from memory
 150      * when calling unset() or when the parent object is garbage collected.
 151      * 
 152      * @see http://paul-m-jones.com/?p=262
 153      * @see http://bugs.php.net/bug.php?id=33595
 154      */
 155      function freeMemory()
 156      {
 157          // We can't use get_class_vars as it does not include runtime assigned attributes
 158          foreach (array_keys((array)$this) as $attribute){
 159              if(isset($this->$attribute)){
 160                  unset($this->$attribute);
 161              }
 162          }
 163      }
 164  
 165  }
 166  
 167  function ____ak_shutdown_function($details = false)
 168  {
 169      static $_registered = false;
 170      static $___registered_objects = array();
 171      if($details === false){
 172          Ak::profile('Calling shutdown destructors');
 173          foreach (array_keys($___registered_objects) as $k){
 174              if(!empty($___registered_objects[$k]) && is_object($___registered_objects[$k]) && method_exists($___registered_objects[$k],'__destruct')){
 175                  Ak::profile('Calling destructor for '.get_class($___registered_objects[$k]));
 176                  $___registered_objects[$k]->__destruct();
 177              }
 178          }
 179      } else if ($details === true && $_registered === false) {
 180          register_shutdown_function('____ak_shutdown_function');
 181          $_registered = true;
 182      } else {
 183          $___registered_objects[] =& $details;
 184      }
 185  }
 186  
 187  }
 188  
 189  ?>


Generated: Mon Oct 27 12:43:49 2008 Cross-referenced by PHPXref 0.6