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 :

[POO] Héritage et variable static


Sujet :

Langage PHP

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 115
    Points : 120
    Points
    120
    Par défaut [POO] Héritage et variable static
    Bonjour,

    Je suis en train de me faire une classe dont le but est de manipuler une ligne d'une table mySQL comme un objet.

    Je sais que cela a déjà était fait x fois. Mais j'essaie de me fait me un framework perso que je maîtrise à 100 % et dont les fonctionnalités soient adaptée à mes besoins (les framework existant sont bien souvent demesuré pour mes besoins) de plus c'est une façon d'approfondir mes connaissances en php.

    L'idee c'est de faire une class "Model" qui comporte toutes les méthodes d'accès à la base, puis des classes qui hérite de model. Ceci afin de ne pas faire de code redondant

    mais je me heurte à un problème d'héritage de variable static (le nom de la table mySQL), car c'est la seule valeur que je doit redefinir, mais ca ne marche pas...

    Merci d'avance pour vos conseils, peut être que je m'y prends mal et que je prends le probleme à l'envers.

    Voici le code en question

    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
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
     
    <?php
     
    include '../includes/sql.class.php';
     
    class Model {
     
    	protected static $table = ''  ;
    	public static $members = Array() ;
     
    	function __construct() { // Constructeur - recupere les champs de la db -> variable d'instance
     
    		if (! sql::init()) {
    			die("Erreur") ;
    		}
     
    		$members = Array() ;
     
    		$SQL = 'SELECT COLUMN_NAME AS nom FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = "'.self::$table.'"' ;
     
    		$result = mysql_query($SQL);
     
    		while ( $row = mysql_fetch_array($result)){ 
    			//if ($row['nom'] != 'created') {
    				array_push(self::$members, $row['nom']) ;
    				$this->$row['nom']= NULL   ; 
    			//}	
    		} 
     
    		sql::close() ;
     
     
    	}
     
    	static function getById($id) { // Retourne l'instance correspondant à l'id - Retourne NULL si pas d'occurence
     
    		sql::init();
     
    		$sql = "SELECT * from ".self::$table." WHERE id = $id LIMIT 0,1" ;
     
    		$results = mysql_query($sql);
     
    			if (mysql_num_rows($results) > 0) {
    				while ( $row = mysql_fetch_array($results)){ 
    					$object = new self() ;
    					$object->load($row);
    					return $object ;
    				} 
    			}
     
    			else return NULL ;
     
    		sql::close() ;
     
    	}
     
    	private function load($row) { // Methode privée de chargement db vers variables d'instance
    		foreach (self::$members as $value) {	
    			$this->$value = $row[$value]  ; 
    		}
    	}
     
     
    	function save() {  // Ajoute l'instance dans la db
     
    		sql::init();
     
    		$fields = '' ;
    		$values = '' ;
     
    		foreach (self::$members as $value) {	
    			$fields .= $value.',' ;   
    			$values .= "'".$this->$value."',";
    		}
     
    		$fields = substr($fields, 0, strlen($fields)-1) ;
    		$values = substr($values, 0, strlen($values)-1) ;
     
    		$sql = "INSERT INTO ".self::$table." ($fields) VALUES ($values)"; 
     
    		mysql_query($sql) or die (mysql_error()); 
     
    		sql::close();
     
    	}
     
    	function update() {  // Mets a jour la ligne dans la db , si aucun parametre : mise a jour de tous les parametres
     
    		sql::init();
     
    		$pairs = '' ;
     
    		if (func_num_args() == 0 ) {
     
    			foreach (self::$members as $member) {	
    				$pairs .= $member.'="'.$this->$member.'",';
    			}
    		}
    		else $pairs = func_get_arg(0) ;	
     
    		$pairs = substr($pairs, 0, strlen($pairs)-1) ;
     
    		$sql = "UPDATE ".self::$table." SET $pairs WHERE id = $this->id"; 
     
    		mysql_query($sql) or die (mysql_error()); 
     
    		sql::close();
     
    	}
     
    	function del() {  //  suprrime l'instance
     
    		sql::init();
     
    		mysql_query("DELETE FROM ".self::$table." WHERE id='$this->id'") or die (mysql_error()); 
     
    		unset($this);
     
    		sql::close();
     
    	}
     
     
    	static function find() { // Retourne un array d'instances
     
    		sql::init();
     
    		$rtr_array = Array();
     
    		if (func_num_args() == 0 ) {
    			$sql = "SELECT * FROM ".self::$table ;
    		}
    		else $sql = func_get_arg(0) ;		
     
    		$results = mysql_query($sql) or die (mysql_error()); 
     
    		if (mysql_num_rows($results) > 0) {
    			while ( $row = mysql_fetch_array($results)){ 
    				$object = new self() ;
    				$object->load($row);
    				array_push($rtr_array, $object)  ;
    			} 
    		}
     
    		return $rtr_array ;
     
    		sql::close();
     
    	}
     
    	public function getMembers() {
    		print_r(self::$members) ;
    	}
     
     
    }
     
     
    class User extends Model {
     
    	protected static $table = 'news' ;
           // self::$table = 'news' ; marche pas non plus
           // parent::$table = 'news' ; marche pas non plus
     
    }
     
    $user = new User ;
    $user->getMembers(); // pour tester
    ?>

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    le problème est que dans le constructeur de Model, self désigne la classe courante donc self::$table retourne ''. Plus d'infos dans les exemples en bas de page.
    Il me semble que la solution serait de ne pas redéfinir la variable mais de la définir à chaque fois via une méthode statique. C'est d'ailleurs plus logique car sinon il faudra que tu modifies le code de ta classe User à chaque fois. Un truc du style (peut-être qu'il y a une meilleure solution...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Model {
    	protected static $table = ''  ;
    	public static $members = Array() ;
    	static function setTable($table)	{
    		self::$table = $table;
    	}
    }
    class User extends Model {
    }
    User::setTable('users');
    $u = new User();
    Ou alors dans le constructeur de User si tu veux définir la table une fois pour toute.

    Quelques trucs qui me semblent bizzare dans ton code :
    - utiliser fetch_assoc au lieu de fetch_array
    - utiliser $array[$nom] = $value au lieu de array_push()
    - Model ne permet que de charger tous les champs, ce qui peut être très lourd sur un ensemble de lignes. Je pense que récupérer le nom des champs à la construction n'est pas une très bonne idée, ca devrait plutôt être fait dans l'autre sens. Personnellement voici en gros comment je procède dans les classes que j'ai développées (en revanche ca implique de ne pas travailler en statique) :

    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
     
    function setField($name, $value = null)	{
    	$this->member[$name] = $value;
    }
    function setFieldsByList($fields)	{
    	$args = func_get_args();
    	foreach($args as $fieldName)	{
    		$this->member[$fieldName] = '';
    	}
    }
    // Ce qui permet de sélectionner uniquement les champs désiré lors du SELECT si members n'est pas vide sinon on crée les noms de champs à la volée
     
    function sqlSelectById($id) {	
    	sql::init();
    	$sql = 'SELECT' ;
    	if(empty($this->members)) {	
    		$sql .= ' * ';
    	}
    	else {
    		$sql .= self::$table.'.'.implode(', '.self::$table.'.', array_keys($this->members));
    	}
    	$sql .= "from ".self::$table." WHERE id = $id LIMIT 0,1" ;
    	$results = mysql_query($sql);
    	if (mysql_num_rows($results) > 0) {
    		while ( $row = mysql_fetch_row($results)){ 
    			$nbFields = count($row);
    			for($j = 0; $j < $nbFields; $j++)	{
    				$this->setField(mysql_field_name($results, $j), $row[$j]);
    		} 
    	}
    }
    voici le type de code que j'obtiens au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $user = new User($nom_table, $nom_cle_primaire, $valeur_cle_primaire):
    $user->setFields('name', 'firstname');
    $user->sqlSelect();
    echo $user->getField('name');
    $user->setField('name', 'Hibon');
    $user->sqlUpdate();
    $user->sqlDelete();

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 115
    Points : 120
    Points
    120
    Par défaut
    Merci pour ta réponse !

    je vais regarder ca en détail , je précise que ma méthode pour recuperer le nom des champs de ma table n'est valable que pour le développement en prod je les mets en dur dans un array afin d'éviter une requête a chaque instanciation

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 115
    Points : 120
    Points
    120
    Par défaut
    bon j'ai trouvé un autre moyen je passe la table comme parametre du constructeur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	protected static $table = ''  ;
    	public static $members = Array() ;
     
    	function __construct($table) { // Constructeur - recupere les champs de la db -> variable d'instance
     
    		self::$table = $table ;
     
    ...
     
     
    $user = new Model("news") ;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] [POO] Héritages de variables statiques
    Par LogistiX dans le forum Langage
    Réponses: 7
    Dernier message: 21/01/2009, 18h07
  2. [POO] Définition des variables membre static
    Par AurélienB dans le forum Langage
    Réponses: 13
    Dernier message: 18/02/2008, 11h39
  3. [POO] Problème avec une variable static
    Par grimsk dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2006, 01h58
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

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