IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] iterator et class


Sujet :

Langage PHP

  1. #21
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    bon ba je vais mettre mon code ca pourra exlaicir pas mal de point et donner peut etre des idées a d'autre

    classe Mysql
    <?php
    class&#160;Mysqldb&#160;implements&#160;Interface_DAO
    {
    private&#160;$res;
    private&#160;$conn;
    private&#160;$login;
    private&#160;$pass;
    private&#160;$serveur;
    private&#160;$base;

    public&#160;function&#160;__construct($serveur,$db,$login=null,$pass=null)
    {

    $this->res==array();
    $this->conn=false;
    $this->login=$login;
    $this->serveur=$serveur;
    $this->pass=$pass;
    $this->db=$db;
    }

    /**
    *&#160;mutator&#160;login&#160;et&#160;mot&#160;de&#160;pass
    *
    *&#160;@param&#160;string&#160;$login
    *&#160;@param&#160;string&#160;$pass
    */
    public&#160;function&#160;setGroupe(Groupe&#160;$data)
    {
    $tab=$data->getGroupe();
    $this->login=$tab['groupname'];
    $this->pass=$tab['mdpData'];
    }

    /**
    *&#160;connexion&#160;a&#160;la&#160;base&#160;de&#160;données
    *
    */
    public&#160;function&#160;connect()
    {
    if(
    false===($this->conn=@mysql_connect($this->serveur,$this->login,$this->pass)))
    throw&#160;new&#160;MyException('Connexion&#160;au&#160;serveur&#160;MySQL&#160;impossible-<br/>serveur&#160;:&#160;'.$this->serveur.'<br/>login&#160;:&#160;'.$this->login.'<br/>pass&#160;:&#160;'.$this->pass.'<br/>base&#160;:&#160;'.$this->db);
    else
    {
    if(
    FALSE===mysql_select_db($this->db,$this->conn))
    throw&#160;new&#160;MyException('Base&#160;introuvable&#160;sur&#160;le&#160;serveur&#160;MySQL&#160;'.$this->db);
    }
    }

    /**
    *&#160;execute&#160;une&#160;requete
    *
    *&#160;@param&#160;requete&#160;$sql
    */
    public&#160;function&#160;execute($sql)
    {
    if(
    FALSE==($this->res=mysql_query($sql,$this->conn)))
    {
    throw&#160;new&#160;MyException($this->res.'&#160;n'est&#160;pas&#160;un&#160;resultat
    valide<br&#160;/>'
    .$sql.'<br/>'.mysql_error($this->conn));
    return&#160;
    false;
    }else
    return&#160;
    true;
    }

    #retour&#160;une&#160;ligne&#160;sous&#160;forme&#160;de&#160;resultat
    /**
    *&#160;test&#160;si&#160;un&#160;reultat&#160;a&#160;ete&#160;trouver
    *
    *&#160;@return&#160;numeric
    */
    public&#160;function&#160;rows()
    {
    if(
    mysql_num_rows($this->res)>0)
    return&#160;
    mysql_fetch_row($this->res);
    else
    throw&#160;new&#160;MyException('pas&#160;de&#160;resultat&#160;trouver&#160;pour&#160;:'.$this->res);
    }

    #retourne&#160;un&#160;nombre&#160;de&#160;ligne
    /**
    *&#160;retourne&#160;le&#160;nombre&#160;de&#160;resultat
    *
    *&#160;@return&#160;int
    */
    public&#160;function&#160;num_rows()
    {
    return&#160;
    mysql_num_rows($this->res);
    }

    #retourne&#160;un&#160;tableau&#160;numerique
    /**
    *&#160;renvoi&#160;les&#160;resultat&#160;de&#160;la&#160;requete&#160;sous&#160;forme&#160;de&#160;tableau&#160;indicé
    *
    *&#160;@return&#160;array
    */
    public&#160;function&#160;GetArray()
    {
    return&#160;
    mysql_fetch_row($this->res);
    }

    #&#160;requete&#160;ne&#160;fonctionnant&#160;pas
    /**
    *&#160;renvoi&#160;les&#160;resultat&#160;de&#160;la&#160;requete&#160;sous&#160;forme&#160;de&#160;tableau&#160;associatif
    *
    *&#160;@return&#160;array
    */
    public&#160;function&#160;GetArrayAssoc()
    {
    return&#160;
    mysql_fetch_assoc($this->res);
    }

    /**
    *&#160;fonction&#160;retournant&#160;un&#160;resultat
    *
    *&#160;@param&#160;string&#160;$field
    *&#160;@return&#160;string&#160;or&#160;false&#160;if&#160;there&#160;are&#160;no&#160;result
    */
    public&#160;function&#160;SimpleResult($field)
    {
    if(
    $this->num_rows()>0)
    return&#160;
    mysql_result($this->res,0,$field);
    else
    return&#160;
    false;
    }
    #recupere&#160;le&#160;dernier&#160;id&#160;inserer
    /**
    *&#160;renvoie&#160;le&#160;dernier&#160;indice&#160;creer&#160;par&#160;insert
    *
    *&#160;@return&#160;numeric
    */
    public&#160;function&#160;last_id()
    {
    return&#160;
    mysql_insert_id($this->conn);
    }

    /**
    *&#160;retourne&#160;le&#160;nombre&#160;d'enregistrement&#160;modifié
    *
    *&#160;@return&#160;int
    */
    public&#160;function&#160;change_rows()
    {
    if(
    mysql_affected_rows($this->conn)==-1)
    $flag=false;
    else
    $flag=true;
    return&#160;
    $flag;
    }

    public&#160;function&#160;escape_string($param)
    {
    foreach&#160;(
    $param&#160;as&#160;$cle=>&$val)
    {
    $val=mysql_escape_string($val);
    }
    }


    public&#160;function&#160;__destruct()
    {
    //mysql_free_result($this->conn);
    @mysql_close($this->conn);
    //echo&#160;'class&#160;:'.__CLASS__.'method'.__METHOD__.'<br/>';
    }
    /**
    *Methode&#160;pour&#160;documentation
    */

    public&#160;static&#160;function&#160;GetInstance()&#160;{
    if&#160;(empty(
    self::$Instance))&#160;{
    $class&#160;=&#160;__CLASS__;
    self::$Instance&#160;=&#160;new&#160;$class;
    }
    return&#160;
    self::$Instance;
    }
    }
    ?>
    class sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <?php
    class Sql implements  IteratorAggregate,ArrayAccess
    {
    	private $db;
    	private $resultat=array();
     
    	public function __construct($db)
    	{
    		$this->db=$db;
    		$this->db->connect();
    	}
     
    	public function getIterator()
    	{
    		$iterator= new Iterators($this->resultat);
    		return $iterator;
    	}
     
    	public function GetArrayAssoc()
    	{
    		$this->resultat=$this->db->GetArrayAssoc();
    		return $this->resultat;
    	}
     
    	public function GetArray()
    	{
    		$this->resultat=$this->GetArray();
    		return $this->resultat;
    	}
     
    	/*
    	*ArrayAccess
    	*
    	*/
     
    	public function offsetExists($index){
    		return isset($this->resultat[$index]);
    	}
     
    	public function &offsetGet($index){
    		return $this->resultat[$index];
    	}
     
    	public function offsetSet($index,$valeur){
    		return $this->resultat[$index]=$valeur;
    	}
     
    	public function offsetUnset($index){
    		unset($this->resultat[$index]);
    	}
     
     
     
    	#requete select normal qui renvoi en tableau numerique
    	public function Select($param=null,$chaine=null)
    	{
     
    		if(array_key_exists('table',$param) && array_key_exists('champs',$param))
    		{
    			$table=$param['table'];
    			$champs=$param['champs'];
    		}
    		else 
    			return false;
    		$req='SELECT '.join(",",$champs);
    		$req.=' FROM '.join(",",$table);
     
    		if(array_key_exists('param',$param))
    		{
    			$param=$param['param'];
    			$req.=' WHERE ('.join(') AND (',$param).') ';
    		}
    		else
    		$req.=' WHERE 1';
    		$req.=' ORDER BY '.$champs[0].' ASC ';
    		if($chaine!=null)
    		$req.=$chaine;
    		return $this->db->execute($req);
    	}
     
     
    	public function Insert_auto($valeur,$chaine=null)
    	{
    		$req='INSERT INTO '.$this->Atable;
    		$erq.=' ('.join(",",$this->Achamp);
    		$req.=' VALUES ('.join(",",$valeur).')';
    		if($chaine!=null)
    		$req.=$chaine;
    		$this->db->execute($req);
    		return $this->db->last_id();
    	}
    }
    ?>
    et une ebuache de l'interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    interface interface_DAO
    {
    	public function GetArrayAssoc();
    	public function GetArray();
    	public function execute();
    	public function connect();
     
    }
    ?>
    et bien sur l'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    $mysql=new Mysqldb(SERVEUR,BASE,LOGIN,PASS);
    $dao=new Sql($mysql);
    $param['table']=array('menu');
    $param['champs']=array('nom');
    $tab['table']=array('menu');
    $tab['champs']=array('id_page');
    try{
    	if($dao->Select($param))
    	{
    		/*$dao->GetArrayAssoc();
     
    		foreach ($dao as $val)
    		{
    			print_r($val);
    		}*/
    		//echo var_dump($dao);
    		while($val=$dao->GetArrayAssoc())
    		{
    			print_r($val);
    		}
    	}
    }
    catch (Exception $e)
    {
    	echo $e->getMessage();
    }

  2. #22
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,
    J'ai commencé, à partir de ce que tu as faits, à faire uen ébauche de classe de connection sur différents type de SGBD.

    Pour faire cela j'ai commencé par faire une inteface qui sera commune aux classe spécifiques à chaque SGBD.
    Et enfin j'ai créé une classe générique, qui vas controler les classes spécifiques à chaque sgbd.

    Ici j'ai collé une interface, pour partir d'un ensemble de fonction standard à toutes les classes implémentant.
    Mais je me demande si une classe abstraite ne serait pas plus adaptée :s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
    /*
        Interface pour la connection à un sgbd
    */
    interface ISqlConnection{
        public function Open();
        public function Close();
    }
     
    /*
        Interface pour executer une commande sur le sgbd
    */
    interface ISqlCommand{
        public function ExceuteQuery($sqlCommand);
        public function ExecuteNonQuery($sqlCommand);
        public function Protect($StringToProtect);
    }
     
    /*
        Interface de résultat d'une commande sql renvoyant des lignes
    */
    interface ISqlQueryResults{
        public function Count();
    }
     
    /*
        Interface de résultat d'une commande sql ne renvoyant pas de lignes
    */
    interface ISqlNonQueryResults{
        public function AffectedRows();
        public function InsertedId();
    }
    ?>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    <?php
     
    /*
        Implémentation mysql de ISqlConnection
    */
    class Mysql implements ISqlConnection{
     
        private $Host_;
        private $Port_;
        private $User_;
        private $Password_;
        private $DbName_;
        private $Link_;
     
        public function __constrcut()
        {
            $this->Host_        = NULL;
            $this->Port_        = NULL;
            $this->User_        = NULL;
            $this->Password_    = NULL;
            $this->DbName_      = NULL;
            $this->Link_        = NULL;
        }
     
        public function Open()
        {
            if($this->Host_ === NULL)
            {
                throw new Exception("Veuillez définir l'adresse du serveur !");
                return false;
            }
     
            $this->Link_ = @mysql_connect($this->Port_ === NULL ? $this->Host_ : $this->Host_.":".$this->Port_
                            , $this->User_
                            , $this->Password_
                            );
     
            if($this->Link_ == false)
            {
                throw new Exception("Il est imposible de se connecter à cette base de donnée.");
                return false;
            }
     
            return true;
        }
     
        public function Close()
        {
            return @mysql_close($this->Link_);
        }
     
        public function SelectDb( $DbName )
        {
            if( ! @mysql_select_db($DbName , $this->Link_ ) )
            {
                $this->DbName_ = NULL;
                throw new Exception("Impossible de selectionner cette base de donnée.");
                return false;
            }
            $this->DbName_ = $DbName;
            return true;
        }
     
        public function __get($prop)
        {
            switch($prop)
            {
                case "Host":
                    return $this->Host_;
                break;
                case "User":
                    return $this->User_;
                break;
                case "Password":
                    return $this->Password_;
                break;
                case "Port":
                    return $this->Port_;
                break;
                case "Link":
                    return $this->Link_;
                break;
                case "DbName":
                    return $this->DbName_;
                break;
                default:
                    throw new Exception("La propriété ".$prop." n'existe pas !");
                break;
            }
        }
     
        public function __set($prop , $value)
        {
            switch($prop)
            {
                case "Host":
                    $this->Host_ = $value;
                break;
                case "User":
                    $this->User_= $value;
                break;
                case "Password":
                    $this->Password_= $value;
                break;
                case "Port":
                    $this->Port_= intval($value);
                break;
                case "DbName":
                    $this->DbName_ = $value;
                break;
                default:
                    throw new Exception("La propriété ".$prop." n'existe pas !");
                break;
            }
        }
     
        public function __destrcut()
        {
            $this->Close();
            unset($this->Host_);
            unset($this->Port_);
            unset($this->User_);
            unset($this->Password_);
            unset($this->DbName_);
            unset($this->Link_);
        }
    }
     
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    <?php
     
    /*
        Implémentation PostgreSQL de ISqlConnection
    */
    class PgSql implements ISqlConnection{
     
        private $Host_;
        private $Port_;
        private $User_;
        private $Password_;
        private $DbName_;
        private $Link_;
     
        public function __constrcut()
        {
            $this->Host_        = NULL;
            $this->Port_        = NULL;
            $this->User_        = NULL;
            $this->Password_    = NULL;
            $this->DbName_      = NULL;
            $this->Link_        = NULL;
        }
     
        public function Open()
        {
            if($this->Host_ === NULL && $this->DbName_ === NULL )
            {
                throw new Exception("Veuillez définir l'adresse du serveur ainsi que la base de donnée !");
                return false;
            }
     
            $this->Link_ = @pg_connect( $this->GetStrConnection() );
     
            if($this->Link_ == false)
            {
                throw new Exception("Il est imposible de se connecter à cette base de donnée.");
                return false;
            }
     
            return true;
        }
     
        public function Close()
        {
            return @pg_close($this->Link_);
        }
     
        public function __get($prop)
        {
            switch($prop)
            {
                case "Host":
                    return $this->Host_;
                break;
                case "User":
                    return $this->User_;
                break;
                case "Password":
                    return $this->Password_;
                break;
                case "Port":
                    return $this->Port_;
                break;
                case "Link":
                    return $this->Link_;
                break;
                case "DbName":
                    return $this->DbName_;
                break;
                default:
                    throw new Exception("La propriété ".$prop." n'existe pas !");
                break;
            }
        }
     
        public function __set($prop , $value)
        {
            switch($prop)
            {
                case "Host":
                    $this->Host_ = $value;
                break;
                case "User":
                    $this->User_ = $value;
                break;
                case "Password":
                    $this->Password_ = $value;
                break;
                case "Port":
                    $this->Port_= intval($value);
                break;
                case "DbName":
                    $this->DbName_ = $value;
                break;
                default:
                    throw new Exception("La propriété ".$prop." n'existe pas !");
                break;
            }
        }
     
     
        public function __destrcut()
        {
            $this->Close();
            unset($this->Host_);
            unset($this->Port_);
            unset($this->User_);
            unset($this->Password_);
            unset($this->DbName_);
            unset($this->Link_);
        }
     
        private function GetStrConnection()
        {
            $str_connect  = "";
            $str_connect .= "host=".$this->Host_;
            if($this->Port_ !== NULL)
            {
            $str_connect .= "port=".$this->Port_;
            }
            if($this->DbName_ !== NULL)
            {
            $str_connect .= "dbname=".$this->DbName_;
            }
            if($this->User_ !== NULL)
            {
            $str_connect .= "user=".$this->User_;
            }
            if($this->Password_ !== NULL)
            {
            $str_connect .= "password=".$this->Password_;
            }
            return $str_connect;
        }
    }
     
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    <?php
    /*
        Classe Générique qui vasencapsuler les différentes classes de SGBD
    */
     
    class SqlConnection
    {
        private $SgbdType_;
        private $SgbdObject_;
     
        public function __construct( $type )
        {
            switch($type)
            {
                case "Mysql":
                    $this->SgbdType_ = $type;
                    $this->SgbdObject_ = new Mysql();
                break;
                case "PgSql":
                    $this->SgbdType_ = $type;
                    $this->SgbdObject_ = new PgSql();
                break;
                default:
                    throw new Exception("Il n'existe pas de définition pour le SGBD ".$type.".");
                break;
            }
        }
     
        public function __call( $MethodName , $MethodArgs )
        {
     
            if( method_exists( $this->SgbdObject_ , $MethodName ) )
            {
                return call_user_method_array($MethodName , $this->SgbdObject_ , &$MethodArgs);
            }
            else
            {
                throw new Exception("cette méthode (".$MethodName.") n'existe pas !'");
            }
            return false;
        }
     
        public function __set( $prop , $value )
        {
            try
            {
                $this->SgbdObject_->$prop = $value;
            }
            catch(Exception $Ex)
            {
                throw $Ex;
            }
            return false;
        }
     
        public function __get( $prop )
        {
            try
            {
                return $this->SgbdObject_->$prop;
            }
            catch(Exception $Ex)
            {
                throw $Ex;
            }
            return false;
        }
    }
     
    ?>
    Usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    include("include.sql-class.php");
     
    $Connection = new SqlConnection("Mysql");
    $Connection->Host       = "localhost";
    $Connection->User       = "root";
    $Connection->Password   = "";
    $Connection->Open();
    $Connection->SelectDb("test");
    var_dump($Connection);
    $Connection->Close();
    ?>
    actuellement ce qui me pose un souci c'est l'utilisation d'une interface... J'ai peur de ne pas pouvoir à l'avenir transtyper un objets Mysql en un PgSql à l'aide d'une super classe....

    J'apprécierais beaucoup si quelqu'un pouvait me faire un retour Sur quoi que ce soit.


    bye

  3. #23
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    Citation Envoyé par ePoX
    ais je me demande si une classe abstraite ne serait pas plus adaptée :s
    je suis loin d'etre un expert mais je dirais qu'une class abstraite n'est pas adapter pour la connexion, executer une requete ou meme recuperer les donnée car c'est des metodes propent a chaque type de base
    donc de toute facon il faudra toutes les implementés

    sinon je connaissais pas la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return call_user_method_array
    grace a cette methode finalement tu pourrai te passer d'interface, mais bon je dirais que c'est un mal neccessaire pour simplifier l'utilisation

  4. #24
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Ouaip, mais l'idée de la classe abstraite au lieu de l'interface c'est juste pour du transtypage, et avoir une base commune.

    Parce qu'une interface, du moins de ce que j'en sais, ne permet un transtypage.

    En gros, j'ai peur qu'une jour j'ai à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $Obj = new Mysgl();
    //... Du code je ne sais pas quoi
     
    // et la une fonction x y qui à besin de transtypé Mysql en PgSql
    function x()
    {
    echo (PgSql)$Obj;
    }
    Avec l'interface j'ai des doutes sur la faisabilité.
    Par contre peut être qu'avec une classe abstraite, jouant le role de super classe, cela pourrait devenir possible.
    Mais je ne sais même pas si j'en aurais besoin!

    Pour ce qui est de la fonction call_user_method_array, j'ai un peu trimé sur cette partie et celle des propriétés, d'ailleurs le try{}catch() des propriétés ne plait pas trop..
    Mais je n'ai pas trouvé de solution plus adéquats.

  5. #25
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    apparement call_user_method_array est obsolete en remplacement ils preferent call_user_method_array par contre je voit pas trop comment passer les arguments de la methode


    personnellement je n'ai jamais utiliser deux base differente dans un projet
    maintenat si c'est pour migre d'une base a une autre (j'ai pas trop de notion la dessu non plus ) mais on tenter d'utiliser xml
    sinon le transcriptage ne pourrai pas etre une methode de SqlConnection

  6. #26
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    call_user_func_array tu veux dire ?

    Sinon oui j'avais vu cela, mais vla la syntaxe... Pour ce qui est du tableau de parametre c'est pas trop un pb puisqu'en utilisant func_get_args tu retrouves les params sous forme de tableau.

    Je posterais la méthode modifiée tout à l'heure.

    Pour ce qui est du transtypage effectivement on pourrais peut etre avoir une methode pour faire cela.
    J'aurais préféré l'implicite, de toute façon je verrais cela quand j'en serais un peu plus loins dans l'ensemble des classses.

  7. #27
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    pour faire ton transtypage, il faudrais que ton pgsql herite de mysql

    sinon tu pourras pas

  8. #28
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    muarf..

  9. #29
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    on peut toujours manipuler une classe comme une de ses super classe mais pas comme une autre classe qui hérite du meme parent.

    Quand tu la manipule comme une de ses parentes, ca ne pose pas de probleme, tu perd juste les specificités que tu as rajouté dans ton héritage.

    Par contre deux dérivées d'un meme parent seront forcement différentes sur quelques methodes. Du coup il saura pas quoi faire ...

    Je sais pas si je suis tres clair

  10. #30
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Sisi tout à fait !

    Faut que je regarde si j'en ai besoin et j'en profiterai pour faire des test comme sa se sera plus clair dans mon esprit !

    Merci

  11. #31
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Jeff_! voici la méthode modifier avec call_user_func_array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public function __call( $MethodName , $MethodArgs )
        {
     
            if( method_exists( $this->SgbdObject_ , $MethodName ) )
            {
                //return call_user_method_array($MethodName , $this->SgbdObject_ , &$MethodArgs);
                return call_user_func_array(array(&$this->SgbdObject_, $MethodName), &$MethodArgs );
            }
            else
            {
                throw new Exception("cette méthode (".$MethodName.") n'existe pas !'");
            }
            return false;
        }
    Finalement je n'ai pas eu besoinde func_get_args(), puisque __call me transmets de suite les paramètres.

    Mais avec une methode non magiques voici ce que cela donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Unefonction(  )
        {
    $args = func_get_args();
           var_dump($args);
        }
    Unefonction("tot","tatat","titi");
    bye

  12. #32
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    euh juste un ti detail de chipoteur

    t es en php 5 donc tu peux enlever les & ^^

  13. #33
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Même pour les tableaux ? :s

  14. #34
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    logiquement c est pareil et puis de tout manière t as envie de les modifier ?

  15. #35
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Non d'ailleurs quand je l'ai fait je me suis posé la question de savoir si je devais le passer par référence ou non...
    Rapport au type qui passe ces arguments et les retrouverais dans un autre état à la sortie de la fonction..

    De toute façon c'est pas clair sur php.net, et je ne devrais pas avoir trois milliards de paramètres donc je vais faire comme tu le dis.

    Merci

    J'en profites pour te poser une question as tu la moindre idée sur comment simuler une classe privée en php ?

  16. #36
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    une classe privée ?
    moi pas comprendre

    tu as le mot private en php 5

  17. #37
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Je sais pas si cela existe en java.. Mais je pensais à C#.

    C# permet de définir une classe privée au sein d'une autre classe.

    Sa permet de créer un espèce de masque d'usinage puisqu'en faites la classe privée ne peut être instanciée que par la classe contenant la dite classe privée (Je suis clair ?).

    sinon un petit exemple de ce que cela donnerais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Papa
    {
       public function FaitunGosse()
       {
           return new Gosse();
       }
       private class Gosse{}
    }
    Tu l'auras compris de cette manière seul Papa peut faire un gosse ! Et dans le cas de ce que je suis entrain de faire j'aurais bien aimé avoir le même sytème.
    Mais pour le moment php ne le permet pas :/

    donc je me demandais si à coup de design patterns je n'aurais pas pu créer la même chose.

  18. #38
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    ben en fait c est ce qu on appel une classe interne (inner class) que la tu met en private.

    Il ne me semble pas que ce soit pris en charge par php effectivement.

    Mais sincérement, je n'ai jamais vu le réel intéret de faire ça.
    Pourquoi empecher des classes de pouvoir en instancier une autre ?
    (oui je sais je me pose des droles de questions des fois)

  19. #39
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    (oui je sais je me pose des droles de questions des fois)
    tu sais ce qu'on dit, Il n'y à que les co** qui ne posent pas de questions :o

    Bref,

    En l'occurence j'ai ma classe de connection, qui chapote une classe dédié à mysql.
    et pour executer une requete l'idée est de passer par une classe MysqlCommand.

    Comme le but est de rendre la classe mysql aussi transparente que possible, je passe par une fonction GetNewCommand, disponible indepaddement que se soit une instance Mysql , Pgsql derriere.

    Hors le type, un peu neuneu, pourrais décider de passer outre et de me declarer un pgSqlcommand pour executer ces commandes Mysql....

    Oui je sais je vais chercher un peu loin... Mais bon :/<mode autocharriage>J'aime bien tout ces trucs après sa fait genre c'est compliquer et tout :o</mode autocharriage>

  20. #40
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    oui ben la tu sais un mec peut aussi vouloir utiliser echo pour lire un fichier xml !

    Si c est documenté, il verra bien ce qu il a a faire.

    Pour que ce soit transparent a l'extreme, c est de faire un truc un peu comme ca:

    • - Une classe abstraite qui définie les methodes communes :
      [list:70310e12ce]- connection/deconnection
      - select
      - update/delete
      - get et set autocommit
      - begin transaction
      - commit/rollback/savepoint
      - execution de procedure
      - preparation de requete paramétrable


    - Des dérivées qui implémente comme il faut.

    - Utilisation des patterns factory et singleton[/list:u:70310e12ce]

    A la limite, tu te fais un fichier d'init (format que tu veux) avec les informations de connexion mais aussi le type de la base qui sera exploité par ta factory.
    Comme ça c'est encore plus transparent.

Discussions similaires

  1. rendre iterable une Classe contenant un tableau 2D
    Par Linschn dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/05/2009, 21h42
  2. Réponses: 3
    Dernier message: 12/06/2008, 16h05
  3. Tableaux d'une Classe
    Par demcoul dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2007, 20h01
  4. [Tableaux] problème en classe
    Par jamjam19 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 21h20
  5. [Tableaux] Utilisations de classes
    Par hudony dans le forum Langage
    Réponses: 8
    Dernier message: 31/12/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo