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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 533 fois - Téléchargée 27 fois

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

Ajouter un commentaire

Commentaires

malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
hello,

je serais toi, je rajouterais un exemple concret d'utilisation de ta classe. Concret, mais exemple neanmoins hein, un truc bidon.
Parce que la je pense que c'est vraiment trop...abstrait :-)

Sinon, bien, c'est la premiere fois que je vois sur CS un code utilisant une classe abstraite :-)
cs_Zart
Messages postés
286
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
27 juin 2006
1 -
Je savais même pas qu'il y avait de l'héritage en PHP (grâce à la v5 surement).
Sinon est-ce que ça existe les interfaces ce serait pas mal util ou bien peut on faire du multi héritage ?
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
JeanPoldeux
Messages postés
64
Date d'inscription
mardi 14 janvier 2003
Statut
Membre
Dernière intervention
5 août 2005
-
Pas mal mais très cpp.

L'idée de MALALAM de donner un exemple d'utilisation ne serait pas de trop.

Perso, même au niveau config, je ne vois pas trop l'intérêt de passer par une classe pour savoir si une var a été initialisée ou pour changer sa valeur.
kankrelune
Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
-
En fait cette class s'inspire de la class XoopsObject et XoopsObjectHandler de xoops... elles permettent la manipulation de données issu de requetes MySQL mais d'une part ces class ne s'utilisent pas toutes seule (mais avec les class générant les requetes) et d'autre part ces class sont les class parentes de class plus complete qui ne concerne qu'une table de la base de donné car elle prennent en compte la structure de la table et les attributs des champs afin d'obtenir un meilleur traitement des données...

par ex la class XoopsUser qui hérite des propriétés de la class XoopsObject et qui est faite pour la table users de xoops... voici sont constructeur...

function XoopsUser($id = null)
{
$this->initVar('uid', XOBJ_DTYPE_INT, null, false);
$this->initVar('name', XOBJ_DTYPE_TXTBOX, null, false, 60);
$this->initVar('uname', XOBJ_DTYPE_TXTBOX, null, true, 25);
$this->initVar('email', XOBJ_DTYPE_TXTBOX, null, true, 60);
$this->initVar('url', XOBJ_DTYPE_TXTBOX, null, false, 100);
$this->initVar('user_avatar', XOBJ_DTYPE_TXTBOX, null, false, 30);
$this->initVar('user_regdate', XOBJ_DTYPE_INT, null, false);
$this->initVar('user_icq', XOBJ_DTYPE_TXTBOX, null, false, 15);
$this->initVar('user_from', XOBJ_DTYPE_TXTBOX, null, false, 100);
$this->initVar('user_sig', XOBJ_DTYPE_TXTAREA, null, false, null);
$this->initVar('user_viewemail', XOBJ_DTYPE_INT, 0, false);
$this->initVar('actkey', XOBJ_DTYPE_OTHER, null, false);
$this->initVar('user_aim', XOBJ_DTYPE_TXTBOX, null, false, 18);
$this->initVar('user_yim', XOBJ_DTYPE_TXTBOX, null, false, 25);
$this->initVar('user_msnm', XOBJ_DTYPE_TXTBOX, null, false, 100);
$this->initVar('pass', XOBJ_DTYPE_TXTBOX, null, false, 32);
$this->initVar('posts', XOBJ_DTYPE_INT, null, false);
$this->initVar('attachsig', XOBJ_DTYPE_INT, 0, false);
$this->initVar('rank', XOBJ_DTYPE_INT, 0, false);
$this->initVar('level', XOBJ_DTYPE_INT, 0, false);
$this->initVar('theme', XOBJ_DTYPE_OTHER, null, false);
$this->initVar('timezone_offset', XOBJ_DTYPE_OTHER, null, false);
$this->initVar('last_login', XOBJ_DTYPE_INT, 0, false);
$this->initVar('umode', XOBJ_DTYPE_OTHER, null, false);
$this->initVar('uorder', XOBJ_DTYPE_INT, 1, false);
// RMV-NOTIFY
$this->initVar('notify_method', XOBJ_DTYPE_OTHER, 1, false);
$this->initVar('notify_mode', XOBJ_DTYPE_OTHER, 0, false);
$this->initVar('user_occ', XOBJ_DTYPE_TXTBOX, null, false, 100);
$this->initVar('bio', XOBJ_DTYPE_TXTAREA, null, false, null);
$this->initVar('user_intrest', XOBJ_DTYPE_TXTBOX, null, false, 150);
$this->initVar('user_mailok', XOBJ_DTYPE_INT, 1, false);

// for backward compatibility
if (isset($id)) {
if (is_array($id)) {
$this->assignVars($id);
} else {
$member_handler =& xoops_gethandler('member');
$user =& $member_handler->getUser($id);
foreach ($user->vars as $k => $v) {
$this->assignVar($k, $v['value']);
}
}
}
}

Comme vous pouvez le voir chaque attribut de la table est initialisé via la méthode initvar en spécifiant différents attributs... à savoir... le nom de la variable $key

$this->vars[$key] = array(

'value' => sa valeur,
'required' => si elle require un formatage html en sortie,
'data_type' => le type de données,
'maxlength' => longueur max si besoin est,
'changed' => si la variable à étée modifiée,
'options' => option d'utilisation
);

Voili voilou... je sais pas si j'ais été clair... muarf... sinon n'hésitez pas à poser des questions... .. .

@ tchaOo°

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.