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 :

PHP et la POO, optimisation des classes


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 12
    Points
    12
    Par défaut PHP et la POO, optimisation des classes
    Bonjour a tous,

    voila sans plus attendre mon problème.
    Je travaille sur un site qui va servir a ressencer les votes d'utilisateurs au sujet de fichiers .doc .
    Quand je me suis lancer dans ce projet j'ai tout de suite commence a reflechir en poo.
    J'ai commence par faire un petit diagrame uml pour representer les principales classes.

    UML simplifie du projet

    Voila en gros comment ca fonctionne : pour chaque classe list on a une classe associee et lors de l'instanciation de la classe list on va aller chercher dans la bdd toute les donnees et pour chaque entree on va instancier la classe "non liste" et l'ajoutee a la liste.

    Le probleme c'est la vitesse de chargement des pages.
    J'ai une page par exemple ou je ressence tout les fichier et pour chaque fichier je ressence le vote et le commentaire de chaque utilisateur. Cette page ave ma poo se charger en 10sec environs et sans en 2 sec environs. Sans poo je veux dire en mettant directement les requettes dans la page.

    Je met une partie du code de ces deux pages :

    Code avec la poo
    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
     
    <?php
    	include '../class/ConnexionPDO.class.php';
    	//include '../php/fonctions.php';
    	date_default_timezone_set('America/Montreal');
    	$date = date('m/j/Y'); 
     
    	include '../class/Ballot.class.php';
    	include '../class/BallotsList.class.php';
    	include '../class/Comment.class.php';
    	include '../class/CommentsList.class.php';
    	include '../class/Standard.class.php';
    	include '../class/StandardsList.class.php';
    	include '../class/User.class.php';
    	include '../class/UsersList.class.php';
     
    	$bList = new BallotsList();
    	$cList = new CommentsList();
    	$sList = new StandardsList();
    	$uList = new UsersList();
    	$pdo = null;
    ?>
     
     
    ...
     
     
    <?php
    foreach($sList->getStandards() as $s) {
    	$yes = 0;
    	$no = 0;
    	echo '<h2>'.$s->getName().'</h2>';
    	echo '
    	<div id = "wasSend'.$s->getNum().'" class="notification notification_green hide">
    		<b>GREAT! Your email was send.</b><div class="notification_close"> Close </div>
    	</div>
    	';
    	echo '<table id="tablo" style = "width : 99%;margin-right:1%;">
    	<tr><th>Name</th><th>Vote</th><th>Comment</th><th></th></tr>';
    	foreach($uList->getList() as $u) {
    		if($u->getCommitee() == 'subcommitee') {
    			$b = $bList->getByStandName($s->getNum(), $u->getNum());
    			if(!$b) {
    				$b = ' - ';
    				$c = 0;
    			}
    			else {
    				$c = $cList->getByTargetNameType($b->getNum(), $u->getNum(), 1);
    				switch($b->getValue()) {
    					case 0 :
    						$b = 'No';
    						$no++;
    						break;
    					case 1 :
    						$b = 'Yes';
    						$yes++;
    						break;
    					case 2 :
    						$b = 'Yes';
    						$yes++;
    						break;
    					case 3 :
    						$b = 'Abstain';
    						$yes++;
    						break;
    				}
    			}
     
    			if(!$c) {
    				$c = '';
    			}
    			else {
    				$c = $c->getText();
    				if(strlen($c) > 100) {
    					$c = substr($c, 0, 100). ' [...]';
    				}
    			}
    			echo '<tr><td>'.$u->getName().'</td><td><center>'.$b.'</center></td><td style = "text-align : justify;">'.$c.'</td><td><center><a href = "fichePerso.php?id='.$u->getNum().'">Details</a></center></td></tr>';
    		}
    	}
    	echo '<tr><td><b>Result</b></td><td style = "width : 100px;">Positive : <span style = "color : green;">'.$yes.'</span><br /> Negative : <span style = "color : red;">'.$no.'</span></td><td> </td><td><center><input type = "button" value = "Send" id = "'.$s->getNum().','.$yes.','.$no.'" name = "'.$s->getNum().'" onClick = "sendEmail(this)"/></center></td></tr>';
    	echo '</table>';
    }
    ?>
    Code sans poo
    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
     
    <?php
    $pdo = new PDO(HOST, USERNAME, PASSWORD);
    foreach($pdo->query('SELECT * FROM standards') as $s) {
    	$yes = 0;
    	$no = 0;
    	echo '<h2>'.$s['name'].'</h2>';
    	echo '
    	<div id = "wasSend'.$s['id'].'" class="notification notification_green hide">
    		<b>GREAT! Your email was send.</b><div class="notification_close"> Close </div>
    	</div>
    	';
    	echo '<table id="tablo" style = "width : 99%;margin-right:1%;">
    	<tr><th>Name</th><th>Vote</th><th>Comment</th><th></th></tr>';
    	foreach($pdo->query('SELECT * FROM users') as $u) {
    		if($u['commitee'] == 'subcommitee') {
    			$b = $pdo->query('SELECT * FROM ballots WHERE standard = '.$s['id'].' AND name = '.$u['id']);
    			if(!$b = $b->fetch()) {
    				$b = ' - ';
    				$c = 0;
    			}
    			else {
    				$c = $pdo->query('SELECT * FROM comments WHERE commentOf = '.$b['id'].' AND commentBy = '.$u['id'].' AND type = 1');
    				switch($b['value']) {
    					case 0 :
    						$b = 'No';
    						$no++;
    						break;
    					case 1 :
    						$b = 'Yes';
    						$yes++;
    						break;
    					case 2 :
    						$b = 'Yes';
    						$yes++;
    						break;
    					case 3 :
    						$b = 'Abstain';
    						$yes++;
    						break;
    				}
    			}
     
    			if($c === 0) {
    				$c = '';
    			}
    			else {
    				$c = $c->fetch();
    				$c = $c['text'];
    				if(strlen($c) > 100) {
    					$c = substr($c, 0, 100). ' [...]';
    				}
    			}
    			echo '<tr><td>'.$u['firstName'].' '.$u['lastName'].'</td><td><center>'.$b.'</center></td><td style = "text-align : justify;">'.$c.'</td><td><center><a href = "fichePerso.php?id='.$u['id'].'">Details</a></center></td></tr>';
    		}
    	}
    	echo '<tr><td><b>Result</b></td><td style = "width : 100px;">Positive : <span style = "color : green;">'.$yes.'</span><br /> Negative : <span style = "color : red;">'.$no.'</span></td><td> </td><td><center><input type = "button" value = "Send" id = "'.$s['id'].','.$yes.','.$no.'" name = "'.$s['id'].'" onClick = "sendEmail(this)"/></center></td></tr>';
    	echo '</table>';
    }
    ?>
    Et un exemple des classe (elle sont toute plus ou moins semblable) :
    Liste
    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
     
    <?php
     
    class BallotsList {
     
    	private $bList = array();
    	private $nb;
     
    	function __construct() {
    		$this->creerList();
    	}
     
    	private function creerList() {
    		$pdo = new PDO(HOST, USERNAME, PASSWORD);
    		$nb = 0;
    		foreach($pdo->query('SELECT * FROM ballots') as $b) {
    			$ballot = new Ballot($b['id'], $b['standard'], $b['name'], $b['value']);
     
    			array_push($this->bList, $ballot);
    			$nb++;
    		}
    		$this->nb =  $nb;
    	}
     
    	function getList() {
    		return $this->bList;
    	}
     
    	function getByNum($n) {
    		foreach($this->bList as $b) {
    			if($b->getNum() == $n) return $b;
    		}
    	}
     
    	function getByStandard($s) {
    		$resultats = array();
    		foreach($this->bList as $b) {
    			if($b->getStandard() == $s) {
    				array_push($resultats, $b);
    			}
    		}
    		return $resultats;
    	}
     
    	function getByName($n) {
    		$resultats = array();
    		foreach($this->bList as $b) {
    			if($b->getName() == $n) {
    				array_push($resultats, $b);
    			}
    		}
    		return $resultats;
    	}
     
    	function getByStandName($s, $n) {
    		foreach($this->bList as $b) {
    			if($b->getName() == $n && $b->getStandard() == $s) {
    				return $b;
    			}
    		}
     
    		return false;
    	}
    }
     
    ?>
    "non Liste"
    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
     
    <?php
     
    class Ballot {
     
    	private $num;
    	private $standard;
    	private $name;
    	private $value; // 0 = no with comment, 1 = yes, 2 = yes with comment, 3 = abstain
     
    	function __construct($n, $s, $na, $v) {
    		$pdo = new PDO(HOST, USERNAME, PASSWORD);
    		if($n == '') {
    			$insert = 1;
    			$n = $pdo->query('SELECT max(id) as id FROM ballots');
    			$n = $n->fetch();
    			$this->num = $n['id'] + 1;
    		}
    		else {
    			$insert = 0;
    			$this->num = $n;
    		}
    		$this->standard = $s;
    		$this->name = $na;
    		$this->value = $v;
    		if($insert)  {
    			$pdo->query('INSERT INTO ballots (id, standard, name, value) VALUES ('.$this->num.', '.$this->standard.', '.$this->name.', '.$this->value.')');
    		}
    	}
     
    	function getNum() {
    		return $this->num;
    	}
     
    	function getStandard() {
    		return $this->standard;
    	}
     
    	function getName() {
    		return $this->name;
    	}
     
    	function getValue() {
    		return $this->value;
    	}
     
    	function setStandard($s) {
    		$pdo = new PDO(HOST, USERNAME, PASSWORD);
    		$pdo->query('UPDATE ballots SET standard = '.$s.' WHERE id = '.$this->getNum());
    		$this->standard = $s;
    	}
     
    	function setName($n) {
    		$pdo = new PDO(HOST, USERNAME, PASSWORD);
    		$pdo->query('UPDATE ballots SET name = '.$n.' WHERE id = '.$this->getNum());
    		$this->name = $n;
    	}
     
    	function setValue($v) {
    		$pdo = new PDO(HOST, USERNAME, PASSWORD);
    		$pdo->query('UPDATE ballots SET value = '.$v.' WHERE id = '.$this->getNum());
    		$this->value = $v;
    	}
    }
     
    ?>
    Voila, merci d'avance pour votre aide!

  2. #2
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    Rien a voir avec la POO

    Tu instancie n fois PDO, avec à chaque fois une nouvelle connexion vers ta base de données, donc évidemment tu as un goulot d'étranglement...

    De plus si tu as vraiment des soucis de perf, enlève tes "Select *", exploite PDO (requêtes préparées...). Une fois que tu seras bon de ce côté là, là tu pourras regarder du côté de PHP.

    Et avant ça je te conseille fortement de suivre quelques cours sur la poo. Le code que tu indique "avec poo" est en réalité du procédural ; Programmer Objet ne consiste pas à utiliser le mot "class" mais à penser ton code de manière Objet. Tu trouveras ce qu'il te faut ici : http://php.developpez.com/cours/

    Pour info je bosse sur des applications avec des milliers d'objets, il n'y a aucun problème. Rassure toi, le moteur Objet de PHP est très performant

    Bon courage !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse.
    Et oui je me doute bien que j'ai encore pas mal de boulot.
    Pour l'instanciation de pdo j'utilise une classe que j'ai cree et qui herite de pdo dans laquelle la connexion est stokee dans une variable statique, je pensais que du coup je n'avais pas de probleme d'instanciation multiple.
    Je te met le code :
    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
    <?php 
    class ConnexionPDO extends PDO
    {
    	private static $_instance;
     
    	function __construct()
    	{}
     
    	static function getInstance()
    	{
    		if (!isset(self::$_instance)) {
     
    			try {
     
    				self::$_instance = new PDO(HOST, USERNAME, PASSWORD);
     
    			} catch (PDOException $e) {
     
    				echo $e;
    			}
    		} 
    		return self::$_instance; 
     
    	}
     
     
    }
    ?>
    Apres pour la cote POO qui n'en est pas, je crois que je comprend ce que tu veux dire mais c'est mon premier projet proffessionnel et j'ai encore un peu de mal a faire face :p.

    Pour en revenir a ma question de vitesse de chargement, c'est possible que ca soit causer par l'instanciation de PDO? Meme avec la variable statique?

    En ce qui concerne les requettes prepaprees je vais les mettre en place pour voir si il y a du changement.

    edit : pour les requetes preparees, dans les classes liste je ne fais qu'une requete dans le constructeur pour recuperer tout les champs (j'ai vraiment besoin du SELECT * d'ailleurs) donc la requete preparee n'apporterai rien ici il me semble.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bon j'ai revu toute mes classes pour supprimer les instanciation multiple de la connection a la bdd en passant en parametre au constructeur une instance qui sert pour toute la page.
    Des 10 sec de chanrgement je suis passe a un peu moins de 2sec.
    Donc probleme resolu.
    Merci pour votre aide et pour le prochain projet je j'ai bosser mes concept d'objet (si le client me laisse le temps).

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

Discussions similaires

  1. [POO] d’encapsulation des classe
    Par amazircool dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2007, 19h33
  2. [POO] Héritage des classes
    Par mic79 dans le forum Langage
    Réponses: 27
    Dernier message: 09/03/2007, 21h02
  3. [POO] Organisation des classes PHP
    Par AsQuel dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2007, 10h09
  4. [POO] conception des classes
    Par poukill dans le forum C++
    Réponses: 229
    Dernier message: 19/07/2006, 09h28
  5. [POO] faire des classes en php
    Par gromit83 dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2006, 17h10

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