Début de classe abstraite pour une meilleur gestion des propriétés

Contenu du snippet

J'ai dévellopé cette classe pour pouvoir gérer une classe de configuration, cela permet de savoir si une variable est nouvelle où a été modifiée, c'est un premier jet, je la poursuivrai en rentrant de vacances (dans 2 semaines).

En tout honnêteté, cette classe est inspiré du projet xoops.

Fonctionnement :

tout d'abord, cette classe DOIT être étendue car c'est une classe abstraite

on initialise les variables avec _initVar(var_name, value, readable, writable) (les 2 derniers paramètres ne concernent que les appels de l'exterieur de la classe)

on peut mettre à jour les variables :
- de l'interieur de la classe (sans restriction) par _setVar(var_name, value)
- de l'exterieur de la classe (uniquement pour les variables dont l'écriture a été autorisée durant leur initialisation) par setVar(var_name, value) ou directement $obj->foo = 'OBJ::FOO'

on peut lire les variables :
- de l'interieur de la classe (sans restriction) par _getVar(var_name, value)
- de l'exterieur de la classe (uniquement pour les variables dont la lecture a été autorisée durant leur initialisation) par getVar(var_name, value) ou directement echo $obj->foo

on peut aussi mettre à jour les variables sans changer leur état (modifiées ou non), mais uniquement de l'intérieur de la classe, par _setVar(var_name, value, false)

enfin, savoir si une variable existe ou non : issetVar(var_name)

Source / Exemple :


<?php
abstract class JFPropertiesManager
{
  protected $_vars = array();

  final public function __get($n)
  {
    return $this->get($n);
  }

  final public function __set($n, $v)
  {
    return $this->set($n, $v);
  }

  final protected function _getVar($n)
  {
    if (isset($this->_vars[$n])) {
      return $this->_vars[$n]['value'];
    } else {
      trigger_error('Undefined variable: '.$n, E_USER_NOTICE);
      return false;
    }
  }

  final protected function _getVars()
  {
    return $this->_vars;
  }

  final protected function _initVar($n, $v = null, $r = false, $w = false)
  {
    $this->_vars[$n] = array('changed' => false, 'new' => false, 'readable' => $r, 'value' => $v, 'writable' => $w);
  }

  final protected function _setVar($n, $v, $c  = true)
  {
    if (isset($this->_vars[$n])) {
      if($this->_vars[$n]['value'] != $v) {
        $this->_vars[$n]['changed'] = $c;
        $this->_vars[$n]['value'] = $v;
      }
      return $v;
    } else {
      trigger_error('Undefined variable: '.$n, E_USER_NOTICE);
      return false;
    }
  }

  final public function getVar($n)
  {
    if (isset($this->_vars[$n])) {
      if ($this->_vars[$n]['readable']) {
        return $this->_vars[$n]['value'];
      } else {
        trigger_error('You are not allowed to get this variable: '.$n, E_USER_NOTICE);
        return false;
      }
    } else {
      trigger_error('Undefined variable: '.$n, E_USER_NOTICE);
      return false;
    }
  }

  final public function issetVar($n)
  {
    if (isset($this->_vars[$n])) {
      return true;
    } else {
      return false;
    }
  }

  final public function setVar($n, $v)
  {
    if (isset($this->_vars[$n])) {
      if ($this->_vars[$n]['writable']) {
        if ($this->_vars[$n]['value'] != $v) {
        $this->_vars[$n]['changed'] = true;
          $this->_vars[$n]['value'] = $v;
        }
        return $v;
      } else {
        trigger_error('You are not allowed to set a value to this variable: '.$n, E_USER_NOTICE);
        return false;
      }
    } else {
      trigger_error('Undefined variable: '.$n, E_USER_NOTICE);
      return false;
    }
  }
}
?>

Conclusion :


Cette classe connait pour le moment pas mal de limitations, impossible de créer de nouvelles variables sans les avoir précédement initialisées, ..., elle est donc amener à évoluer, pour toute idée, suggestion, n'hésitez pas.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.