begin process at 2010 02 10 02:09:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] CLASSE BASE DE DONNÉES

[PHP5] CLASSE BASE DE DONNÉES


 Information sur la source

Note :
7,67 / 10 - par 3 personnes
7,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :classe, database, générique, singleton, factory Niveau :Initié Date de création :02/12/2005 Date de mise à jour :02/12/2005 16:57:10 Vu / téléchargé :9 735 / 595

Auteur : malalam

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

 Description

Cette source se base sur la classe mysql de FhX :
http://www.phpcs.com/code.aspx?ID=33135
Elle y ajoute quelques subtilités ;-)
- permet de se connecter à n'importe quel sgbd dont on a définit la classe (2 à l'heure actuelle, à titre d'exemple : mysql et mssql), avec 1 seul et même appel. En fait, on instancie notre objet en lui passant en paramètre le nom de base. Cela permet de réutiliser le projet quel que soit le sgbd installée, et ce à moindre coût.
- n'autorise qu'une seule et unique instance de l'objet db.
- utilisation de la fonction magique __autoload

Source

  • //fichier dbfactory.cls.php
  • <?php
  • abstract class dbfactory {
  • private static $instance; // Instance courante de la classe
  • protected $_config; // Paramètres de configuration base de donnée.
  • protected $query; // Ressource de query
  • public $history = array(); // Historique des requêtes
  • public $query_id = 0; // Compteur de requêtes.
  • // Initialise les variables de connections et active la connection à la base de donnée.
  • // Constructeur protégé permettant de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
  • protected function __construct ($host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
  • if ( !is_array($this->default_cfg) ) {
  • throw new Exception('Vous devez remplir les paramètres de la configuration par defaut de votre base de donnée');
  • }
  • foreach ($this->default_cfg as $key=>$val ) {
  • $this->_config[$key] = (isset($$key) ) ? $$key : $val;
  • }
  • unset($this->default_cfg); // Enlève les paramètres par defaut pour éviter toute confusion possible.
  • $this->connect();
  • }
  • // usinage : permet d'instancier la classe correcte en fonction de la db choisie
  • public static function factory ($type, $host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
  • if (class_exists ($type)) {
  • $className = $type;
  • return new $className ($host, $user, $passwd, $name);
  • } else {
  • throw new Exception ('Pas d\'implémentation disponible pour ' . $type);
  • }
  • }
  • // n'autorise qu'une seule instance de la classe
  • public static function singleton () {
  • if (!isset(self::$instance)) {
  • $c = __CLASS__;
  • self::$instance = new $c;
  • }
  • return self::$instance;
  • }
  • // on avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
  • public function __clone() {
  • trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
  • }
  • // méthodes abstraites
  • abstract protected function connect();
  • abstract public function __destruct();
  • abstract public function query($sql, $desc=NULL);
  • abstract public function fetch_assoc($query=NULL);
  • /*
  • abstract public function num_rows($query=NULL);
  • abstract public function fetch_row($query=NULL);
  • abstract public function fetch_array($query=NULL);
  • abstract public function free();
  • */
  • }
  • ?>
  • //fichier mysql.cls.php
  • <?php
  • class mysql extends dbfactory {
  • protected $default_cfg = array(
  • 'host' => 'localhost',
  • 'user' => 'root',
  • 'passwd' => '',
  • 'name' => 'test');
  • // connection à la base
  • protected function connect () {
  • $this->_config['link'] = @mysql_connect($this->_config['host'],
  • $this->_config['user'],
  • $this->_config['passwd']);
  • if (!$this->_config['link'] ) {
  • throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.');
  • }
  • $this->_config['base'] = @mysql_select_db($this->_config['name'], $this->_config['link']);
  • if (!$this->_config['base'] ) {
  • throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.');
  • unset($this->_config);
  • }
  • echo 'connection réussie avec '.__CLASS__;
  • }
  • // Fermeture de la base de données au moment de la destruction de la classe.
  • public function __destruct() {
  • mysql_close($this->_config['link']);
  • }
  • // création d'une requête et historisation
  • public function query ($sql, $desc=NULL) {
  • $start = microtime (true);
  • $this->query = @mysql_query ($sql, $this->_config['link'] );
  • $query_time = microtime (true) - $start;
  • if ($this->query) {
  • $this->query_id++;
  • $this->history[$this->query_id] = array('desc' => $desc,
  • 'query' => $sql,
  • 'time' => $query_time);
  • return $this->query;
  • } else {
  • throw new Exception (mysql_error() );
  • return false;
  • }
  • }
  • // récupère les résultats dans un tableau associatif
  • public function fetch_assoc ($query=NULL) {
  • if (isset($query)) {
  • $this->query = $query;
  • }
  • return mysql_fetch_assoc ($this->query);
  • }
  • }
  • ?>
  • //fichier mssql.cls.php
  • <?php
  • class mssql extends dbfactory {
  • protected $default_cfg = array(
  • 'host' => 'localhost',
  • 'user' => 'root',
  • 'passwd' => '',
  • 'name' => 'test');
  • // connection à la base
  • protected function connect () {
  • $this->_config['link'] = @mssql_connect($this->_config['host'],
  • $this->_config['user'],
  • $this->_config['passwd']);
  • if (!$this->_config['link'] ) {
  • throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.');
  • }
  • $this->_config['base'] = @mssql_select_db($this->_config['name'], $this->_config['link']);
  • if (!$this->_config['base'] ) {
  • throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.');
  • unset($this->_config);
  • }
  • echo 'connection réussie avec '.__CLASS__;
  • }
  • // Fermeture de la base de données au moment de la destruction de la classe.
  • public function __destruct() {
  • mssql_close($this->_config['link']);
  • }
  • public function query ($sql, $desc=NULL) {
  • $start = microtime(true);
  • $this->query = @mssql_query ($sql, $this->_config['link'] );
  • $query_time = microtime (true) - $start;
  • if ($this->query) {
  • $this->query_id++;
  • $this->history[$this->query_id] = array ('desc' => $desc,
  • 'query' => $sql,
  • 'time' => $query_time);
  • return $this->query;
  • } else {
  • throw new Exception (mssql_erget_last_message());
  • return false;
  • }
  • }
  • public function fetch_assoc ($query=NULL) {
  • if (isset ($query)) {
  • $this->query = $query;
  • }
  • return mssql_fetch_assoc ($this->query);
  • }
  • }
  • ?>
  • //fichier index.php exemple
  • <?php
  • // on utilise la fonction magique __autoload pour charger automatiquement tous les fichiers de classe lorsqu'un appel est demandé.
  • function __autoload($class_name) {
  • require_once ($_SERVER['DOCUMENT_ROOT'].'/tests/classes/'.$class_name . '.cls.php');
  • }
  • try {
  • $db = dbfactory::factory ('mysql', 'localhost', 'root', '', 'test');
  • } catch (Exception $e) {
  • die($e->getmessage());
  • }
  • $requete = $db->query ('SELECT * FROM te', 'test de requête');
  • while ($res = $db->fetch_assoc ($requete)) {
  • echo '<br />', $res['1'], '<br />';
  • }
  • var_dump ($db->history);
  • ?>
//fichier dbfactory.cls.php

<?php
abstract class dbfactory {

    private static $instance;                   // Instance courante de la classe
    
    protected $_config;                         // Paramètres de configuration base de donnée.
    protected $query;                           // Ressource de query
    
    public $history = array();                  // Historique des requêtes
    public $query_id = 0;                       // Compteur de requêtes.


    // Initialise les variables de connections et active la connection à la base de donnée.
    // Constructeur protégé permettant de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
     protected function __construct ($host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
        if ( !is_array($this->default_cfg) ) {
         throw new Exception('Vous devez remplir les paramètres de la configuration par defaut de votre base de donnée');
        }

        foreach ($this->default_cfg as $key=>$val ) {
             $this->_config[$key] = (isset($$key) ) ? $$key : $val;
        }

        unset($this->default_cfg); // Enlève les paramètres par defaut pour éviter toute confusion possible.
        $this->connect();
    }
   
    // usinage : permet d'instancier la classe correcte en fonction de la db choisie
    public static function factory ($type, $host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
        if (class_exists ($type)) {
            $className = $type;
            return new $className ($host, $user, $passwd, $name);
        } else {
            throw new Exception ('Pas d\'implémentation disponible pour ' . $type);
        }
    }
    
    // n'autorise qu'une seule instance de la classe
    public static function singleton () {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
    return self::$instance;
    }

    // on avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
    public function __clone() {
       trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
    }

    // méthodes abstraites
    abstract protected function connect();
    abstract public function __destruct();
    abstract public function query($sql, $desc=NULL);
    abstract public function fetch_assoc($query=NULL);
    /*
    abstract public function num_rows($query=NULL);
    abstract public function fetch_row($query=NULL);
    abstract public function fetch_array($query=NULL);
    abstract public function free();
    */
}
?>


//fichier mysql.cls.php

<?php
class mysql extends dbfactory {

    protected $default_cfg = array(
             'host'   => 'localhost',
             'user'   => 'root',
             'passwd' => '',
             'name'   => 'test');

    // connection à la base
    protected function connect () {
        $this->_config['link'] = @mysql_connect($this->_config['host'],
                                              $this->_config['user'],
                                              $this->_config['passwd']);
        if (!$this->_config['link'] ) {
            throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.');
        }

        $this->_config['base'] = @mysql_select_db($this->_config['name'], $this->_config['link']);
        if (!$this->_config['base'] ) {
            throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.');
            unset($this->_config);
        }
    echo 'connection réussie avec '.__CLASS__;
    }

    // Fermeture de la base de données au moment de la destruction de la classe.
    public function __destruct() {
        mysql_close($this->_config['link']);
    }

    // création d'une requête et historisation
    public function query ($sql, $desc=NULL) {
        $start = microtime (true);
        $this->query = @mysql_query ($sql, $this->_config['link'] );
        $query_time = microtime (true) - $start;
        if ($this->query) {
            $this->query_id++;
            $this->history[$this->query_id] = array('desc' => $desc,
                                                    'query' => $sql,
                                                    'time' => $query_time);
            return $this->query;
    } else {
        throw new Exception (mysql_error() );
        return false;
        }

    }

    // récupère les résultats dans un tableau associatif
    public function fetch_assoc ($query=NULL) {
        if (isset($query)) {
            $this->query = $query;
        }
        return mysql_fetch_assoc ($this->query);
    }
    
}
?>

//fichier mssql.cls.php

<?php
class mssql extends dbfactory {

    protected $default_cfg = array(
             'host'   => 'localhost',
             'user'   => 'root',
             'passwd' => '',
             'name'   => 'test');


// connection à la base
    protected function connect () {
        $this->_config['link'] = @mssql_connect($this->_config['host'],
                                              $this->_config['user'],
                                              $this->_config['passwd']);
        if (!$this->_config['link'] ) {
            throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.');
        }

        $this->_config['base'] = @mssql_select_db($this->_config['name'], $this->_config['link']);
        if (!$this->_config['base'] ) {
            throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.');
            unset($this->_config);
        }
    echo 'connection réussie avec '.__CLASS__;
    }

    // Fermeture de la base de données au moment de la destruction de la classe.
    public function __destruct() {
        mssql_close($this->_config['link']);
    }

     public function query ($sql, $desc=NULL) {
        $start = microtime(true);
        $this->query = @mssql_query ($sql, $this->_config['link'] );
        $query_time = microtime (true) - $start;
        if ($this->query) {
            $this->query_id++;
            $this->history[$this->query_id] = array ('desc' => $desc,
                                                    'query' => $sql,
                                                    'time' => $query_time);
            return $this->query;
    } else {
        throw new Exception (mssql_erget_last_message());
        return false;
        }

    }

    public function fetch_assoc ($query=NULL) {
        if (isset ($query)) {
            $this->query = $query;
        }
        return mssql_fetch_assoc ($this->query);
    }
}
?>

//fichier index.php exemple

<?php
// on utilise la fonction magique __autoload pour charger automatiquement tous les fichiers de classe lorsqu'un appel est demandé.
function __autoload($class_name) {
   require_once ($_SERVER['DOCUMENT_ROOT'].'/tests/classes/'.$class_name . '.cls.php');
}

try {
    $db = dbfactory::factory ('mysql', 'localhost', 'root', '', 'test');
}   catch (Exception $e) {
        die($e->getmessage());
    }

$requete = $db->query ('SELECT * FROM te', 'test de requête');
while ($res = $db->fetch_assoc ($requete)) {
    echo '<br />', $res['1'], '<br />';
}
var_dump ($db->history);
?>

 Conclusion

J'ajouterai de vraies fonctionnalités plus tard peut-être.
En attendant, vous n'avez plus qu'à implémenter (un simple copier coller suffit pour la version mysql) celles développées par FhX dans sa classe.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 décembre 2005 16:57:10 :
Rajout d'un oubli...

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - SINGLETON CLASS par Waredan
POO - PARAMETERHOLDER CLASS par Waredan

 Sources en rapport avec celle ci

Source avec Zip POO - FACTORY CLASS par Waredan
Source avec Zip INTERFACE DATABASE ET CLASSE MYSQL par Davjack
CLASSE DATABASE POUR CONNECTION ET MODIFICATION D'UNE BDD MY... par franco_se
Source avec Zip GENERER ET TRAITER UN FORMULAIRE LAMBDA par craso
CLASSE DE CONNEXION À UNE BASE DE DONNÉE MYSQL par Dansupersayan

Commentaires et avis

Commentaire de FhX le 02/12/2005 17:39:01

Moi je dis y'a du copitage :D

Heuresement que je ne suis pas sucéptible :) En tout cas, y'a au moins quelqu'un qui aime ma source de départ =)

Commentaire de vincseize le 05/12/2005 16:27:50

Cela à l air super interressant en tout cas ... le temps de le tester et bien comprendre le code (car c'est assez balèze je trouve )

Commentaire de malalam le 05/12/2005 16:32:09 administrateur CS

FhX => bah voui, elle est vachement bien ta classe :-) C'est pour ça que je la réutilise.
Par contre, en prod, je vais virer l'historisation. Ca alourdit trop l'instance. Mais en dév, et en test, c'est très intéressant

Commentaire de sjon le 07/12/2005 18:50:58

Sael og blesud

Il y a des jours comme ça, devant de tels codes, où l'on regrette presque de ne pas savoir coder en php ... ;-) ... Bravo Malalam ... Bravo FhX ;-) ...

Commentaire de eXon le 07/12/2005 19:11:20

Tant qu'à utiliser PHP5 pourquoi pas utiliser simplement la classe de MySQLi?

Commentaire de FhX le 07/12/2005 20:48:03

Parce qu'on aime bien faire ca nous-même :)
Faut qu'on remplisse nos trous dans la journée !

Commentaire de FhX le 07/12/2005 20:59:18

Merci Sjon :)
Au passage, apprendre le PHP n'est pas vraiment le plus dur ! Même si j'ai encore quelques lacunes (surtout en expressions régulières et un peu en SQL), il est assez aisé de concevoir certaines choses :)

L'exemple est ci-dessus =)

Malalam, me dis pas que tu utilises des morceaux de ma classe pour tes propres projets... si ? ;)

Commentaire de malalam le 08/12/2005 09:38:57 administrateur CS

Merci Sjon ;-)

FhX => Nan, vais la réécrire, je t'ai dit, sont farouchement contre l'utilisation de php5, toujours (m'enfin je n'abdique pas encore).
Et puis je me rends compte qu'elle n'est pas adaptée à mes besoins pour un gros projet, faudrait enlever des trucs, en rajouter...lol. Bref la changer. Mais bon, sinon, oui, je l'utiliserais volontiers pour un de mes projets, où on me paye grassement... ;-)
Je vais garder ton histoire de config, passer le connect en public (enfin en php4 on s'en tape un peu), mettre un close (), et, malgré tes réticences ;-) ouvrir et fermer ma connexion en gardant l'instance :-) Je garde mon singleton et ma factory je pense (je réflêchis au singleton parce que ta remarque sur le fait qu'on ne peut dans ce cas pas se connecter à plusieurs bdd commence à me travailler : et si je finissais par en avoir besoin ? ;-)). Je vais aussi virer l'historisation histoire d'alléger l'obet (en production uniquement, je la garde en dév).
Mais un truc me dérange actuellement : j'ai fait un test en instanciant mon objet, et en faisant 2 requêtes : je requête, je ferme la connexion, je traite, je réouvre, je requête, je ferme,  je traite...: j'ai 2 ouvertures de connexion dès le départ :-( donc 3 en tout, et 2 fermetures (plus la destruction de l'objet...). Et si je passe le link dans la méthode close (), il n'arrive pas à fermer (le link ne correspond pas à la dernière connexion utilisée apparemment). Bref je travaille là-dessus. Et  de touytes façons suis en phase de test de mon modèle de données, donc je verrai à l'utilisation ce dont j'ai besoin exactement, quitte à tout réécrire au final.

Exon => bah ouais, comme FhX dit ;-) En l'occurence, j'aime créer mes objets aussi parce qu'au moins, eux, je suis sûr de les maîtriser complètement...et qu'ils sont adaptés à mes besoins, pas plus (je parle là de dév en prod, dans mon taf quoi). Et si ce n'est pas dans un cadre professionnel, bah autant s'amuser! Et donc coder...
En fait c'est déjà fait, mais un truc

Commentaire de FhX le 08/12/2005 13:24:24

Re-regarde ma source, j'ai épuré et pris en compte ce que tu m'as dis !

Commentaire de malalam le 08/12/2005 13:40:57 administrateur CS

J'ai vu :-) D'ailleurs j'ai récupéré, j'ai encore fait une petite modif...lol (j'ai ajouté le singleton et la factory encore... ;-) ) :
public function __destruct() {
      if (isset($this->_config['link']) ) {
        mysql_close($this->_config['link']);
      }
    }
Parce que sinon, j'avais systématiquement une erreur étrange, dans UNKNOWN, ligne 0, without stack...fatal error, un truc dans le genre. Je pense qu'il essayait d'accéder aux prorpiétés déjà détruites de l'objet (les messages d'erreur).

Commentaire de FhX le 08/12/2005 14:29:47

Ah voui éxact.... honte à moi :o

Commentaire de FhX le 08/12/2005 14:32:21

Mais je vais pas le faire comme ca mon destructeur :)
public function __destruct() {
if ( isset($this->_config['link']) ) mysql_close();
unset($this);
}

Ca m'évite d'appeler la méthode close() pour refaire un test si il existe déja une liaison avec la base de donnée !

Oui ? Non ? Mieux ? Pire ?

Commentaire de malalam le 08/12/2005 14:34:22 administrateur CS

En fait c'est ce que j'avais fait au départ, le unset, mais après j'avais laissé le throw et du coup j'avais tjrs l'erreur ;-)
Donc oui, ça me semble mieux. Je vais tester, vu que je suis dessus là :-)

Commentaire de malalam le 08/12/2005 14:36:40 administrateur CS

Tu as ma bénédiction, ça fonctionne ;-)

Commentaire de FhX le 08/12/2005 15:05:59

Amen ! :)

Commentaire de Zzarbi974 le 21/11/2006 15:33:49

Je suis en train de faire une classe d'abstraction mysql en me basant sur tes sources (pour le singleton) et celle de FhX (Pour toute les options ajoutées), et je vien de voir une "erreur", et je voulais savoir s'il y aurai une solution.
En effet à la ligne 32 tu vérifies si la class est implémentée pour la base de données que tu veux, et tu génères une exception si elle ne l'est pas.

Le problème c'est que lorsqu'on utilise un autoload (comme c'est le cas), si la classe n'est pas implémentée, php génère une erreure fatal lors de l'execution de class_exist(). Il dit : Fatal error: require_once() sur le fichier de class qui n'existe pas vu qu'elle n'est pas implémenté. On dirait que autoload tente quand même de la charger. Evidemment l'exception que tu veux générer dans ce cas là est inutile...

Commentaire de malalam le 21/11/2006 16:18:59 administrateur CS

Hello,

tente un try {} catch () {} dans l'autoload, en attendant que je comprenne ce que tu expliques et que je teste ;-)

Commentaire de Zzarbi974 le 21/11/2006 17:37:21

Le try catch n'y change rien...
En fait autoload fait des require_once().

Donc si je suis l'aglo de ton singleton, si je fait : $db = dbfactory::factory ('bidulesql', 'localhost', 'root', '', 'test');
Arriver à la ligne 32, class_exist() tente de vérifier que la classe bidulesql n'existe pas.
Mais apparament PHP interprètre ça comme une instanciation à la classe bidulesql (comme $r = new bidulesql();), et donc avec la fonction autoload, il essaye de faire un require_once({...}bidulesql.cls.php'); et comme ce fichier n'existe pas on a affaire à une erreur.
Je te laisse tester tu comprendra :)

Commentaire de malalam le 21/11/2006 18:03:19 administrateur CS

Je comprends, mais selon moi, il est normal d'avoir une erreur fatale si la classe que l'on tente d'instancier n'existe pas.
Ceci dit, tu as raison pour l'exception levée dans ce cas.
Voilà la modif qui permet d'éviter le fatal error, et d'attraper l'exception :

function __autoload($class_name) {
if (file_exists ($_SERVER['DOCUMENT_ROOT'].'/cls/dbfactory/classes/'.$class_name . '.cls.php')) {
require_once ($_SERVER['DOCUMENT_ROOT'].'/cls/dbfactory/classes/'.$class_name . '.cls.php');
}
}

PS : j'ai mis MES chemins, hein... ;-)

Commentaire de slimane3 le 29/10/2007 19:09:49

Salut,

Je trouve ta classe vraiment pas mal du tout. Par contre ya un point sur lequel je bloque:
C'est au niveau de ta classe abstraite dbfactory. Tu as une méthode factory, et une autre singleton.
A quel moment la méthode singleton est-elle appelée? Est ce automatique?
Sinon pourquoi ne pas combiner les deux en une seule fonction (faire ce que fait factory() dans singleton()
et ensuite
instancier un objet en faisant dbfactory::singleton(...)

Pourrais tu s'il te plait m'éclairer sur ce point, ça me trouble un peu,
j'ai l'impression qu'y a un truc qui m'échappe...

Je te remercie d'avance.

A+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Design pattern : Factory [ par neigedhiver ] Salut, Je me pose une question tout bête. Est-il judicieux d'embarquer une factory dans une classe abstraite, ou est-il préférable d'utiliser une cla Classe abstraite DataBase [ par codefalse ] Hello les gens :)J'ai développé un petit ensembles de classes en php 5, et j'aimerai votre avis :)Je ne vous le cacherai pas, je me suis énormément ba Design Patterns : Singleton et Classe Abstraite [ par neigedhiver ] Salut, N'étant pas encore au point avec les motifs de conception, je me pose une question qui a sûrement une réponse toute bête. J'aimerais avoir un classe générique pour parser tout type de fichier xml [ par mams004 ] Bonjour, je cherche desespérement une classe php générique pour parser tout type de ficher XML Si vous connaisser des liens ou tuto? merci pour probleme d'instance de classe [ par gretata ] bonjour a tous !! j'ai un problème au niveau des objets en PHP, je ne comprend pas bien comment ils fonctionnent. j'essai de faire un get sur un obj J'aurai besoin d'un peut d'aide svp [ par Underskill ] Bonsoir J'aurais besoin d'aide. Je n'arrive pas afficher les fonction correctement pour afficher le script esceque vous pouriez m'aider svp Le script Algo "modified preorder tree traversal" [ par kohntark ] Salut, Une fois n'est pas coutume je VEUX un code tout fait !!! (<== [^^mad5] règlement !!) [^^yeuxenlair] ma masse capillaire commence à souffrir d Champ faisant référence à une autre classe. [ par finalspirit ] Bonjour,Je suis actuellement en DUT Informatique et on a appris à utiliser le Java. Je connais donc les classes.Je vois pas comment ça fonctionne sous appeller de fonction "interclasses" [ par DDelec24 ] Bonjour.Je suis bloqué depuis hier sur un problème pour appeller une fonction.Pour résumé:Je possède une classe mysql pour gérer tout ce qui est reque Probleme POO [ par cedriclomb ] Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b-&gt;loadModule


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,842 sec (3)

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