begin process at 2010 09 06 06:18:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > DÉBUT DE CLASSE ABSTRAITE POUR UNE MEILLEUR GESTION DES PROPRIÉTÉS

DÉBUT DE CLASSE ABSTRAITE POUR UNE MEILLEUR GESTION DES PROPRIÉTÉS


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Niveau :Initié Date de création :24/07/2005 Date de mise à jour :24/07/2005 18:24:24 Vu :2 144

Auteur : Gorrk

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

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

  • <?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;
  • }
  • }
  • }
  • ?>
<?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.


 Historique

24 juillet 2005 18:24:24 :
Correction de l'introduction

 Sources du même auteur

Source avec Zip CLASSE POUR CREER UN OBJET DYNAMIQUE PHP5
Source avec Zip CLASSE D'EXCEPTIONS ET DE GESTIONS D'ERREURS PHP5
Source avec Zip FONCTION PRATIQUES POUR MANIPULER LES PARAMETRES HTTP
Source avec Zip CLASSE DE NEWS PHP5
Source avec Zip CLASSE MYSQL PHP5

 Sources de la même categorie

Source avec Zip Source avec une capture MY.EXCEPTION par inwebo
SIMPLIFIEZ VOS CONNEXIONS FTP AVEC LEGFTP ! par leglopin
Source avec une capture CLASSE GÉNÉRATEUR DE CODES BARRES 2D DATAMATRIX par TorTukiTu
CLASSE MAIL par djguigui34400
Source avec Zip DÉBOGAGE D'UN CODE PHP (SUIVIT DES VARIABLES) par originalcompo

Commentaires et avis

Commentaire de malalam le 25/07/2005 10:57:07 administrateur CS

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 :-)

Commentaire de Zart le 25/07/2005 16:28:33

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 ?

Commentaire de malalam le 25/07/2005 17:08:04 administrateur CS

Zart => http://de.php.net/manual/fr/language.oop5.interfaces.php

Commentaire de JeanPoldeux le 05/08/2005 00:12:31

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.

Commentaire de kankrelune le 25/12/2005 18:23:21

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°

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales