phpbar.de logo

Mailinglisten-Archive

[php] singleton mit parametern

[php] singleton mit parametern

Andreas Demmer php at andreas-demmer.de
Fre Mar 26 17:41:50 CET 2004


Hier mal mein Lösungsansatz für variable
Parameter des Konstuktors. Arbeitet zwar mit
eval() [eval is evil] aber ist sehr bequem wenn
man weiss was man tut! :-)

<?php
  /**
   * @return pointer
   * @desc Verwaltet die Singleton-Klasse und nimmt eine freie
           Anzahl an Parametern entgegen. Param1 ist die zu
           instanzierende Klasse, Param2 das Alias der Klasse,
           Param 3 bis ParamN sind optionale Parameter des
           Konstuktors. Liefert eine Referenz auf das instanzierte
           Exemplar der Klasse zurück
   */
  function &singleton() {
      static $singleton;

      if(func_num_args() < 1) {
          die('FEHLER: Singleton-Funktion ohne Klassen-Name aufgerufen!');
      } else {
          $arguments = func_get_args();
      }

      if(!is_object($singleton)) {
          $singleton = new singleton();
          $singleton->setIncludePath(PATH_INCLUDES);

      }

      $singleton->loadObject($arguments);
      return $singleton->getObject($arguments[1]);
  }

  /**
   *
   */
  class singleton {
      /**
       * @var array
       * @desc enthält die Exemplare der geladenen Klassen
       */
      var $objects = array();

      /**
       * @var string
       * @desc Pfad zu den zu inkludenden Klassen
       */
      var $includePath = NULL;

      /**
       * @access public
       * @return void
       * @desc Konstruktor ohne Funktion
       */
      function singleton() {
      }

      /**
       * @access public
       * @return bool
       * @param arguments array
       * @desc lädt ein Exemplar der Klasse $arguments[0] als Alias
               $arguments[1] mit den Konstruktor-Parametern $arguments[2]
               bis $arguments[n]
       */
       function loadObject($arguments) {
           $className = array_shift($arguments);
           $classAlias = array_shift($arguments);
           $argumentString = NULL;

           if(!class_exists($className)) {
               $classFile =
$this->includePath.'class_'.strtolower($className).'.inc.php';

               if(file_exists($classFile)) {
                   @include_once($classFile);
               }
           }

           if(class_exists($className)) {
               if($classAlias == NULL) {
                   die('FEHLER: Dem Singleton wurde kein Alias der Klasse
"'.$className.'" übergeben!');
               }

               if(!is_object($this->objects[$classAlias])) {
                   for($i = 0; $i <= count($arguments) - 1; $i++) {
                       $argumentString .= '$arguments['.$i.'], ';
                   }

                   $argumentString = substr($argumentString, 0,
strlen($argumentString) - 2);
                   $code = '$class = new
'.$className.'('.$argumentString.');';
                   eval($code);
                   $this->objects[$classAlias] = $class;

                   $returnValue = TRUE;
               } else {
                   $returnValue = FALSE;
               }
           } else {
               die('FEHLER: Singleton-Klasse kann kein Exemplar der Klasse
"'.$className.'" erstellen!');
           }

           return $returnValue;
       }

      /**
       * @access public
       * @return mixed
       * @param classAlias string
       * @desc liefert das Exemplar der Klasse mit dem Alias
               $classAlias zurück oder FALSE falls keine Klasse
               mit diesem Alias existiert
       */
      function &getObject($classAlias) {
          if(isset($this->objects[$classAlias]) &&
is_object($this->objects[$classAlias])) {
              return $this->objects[$classAlias];
          } else {
              return FALSE;
          }
      }

      function setIncludePath($path) {
          $this->includePath = $path;
      }
  }
?>

Gruss,
Andreas

-- 
http://www.midgetcms.de



php::bar PHP Wiki   -   Listenarchive