Passer a la POO

Eléphanteau du PHP | 21 Messages

24 juin 2007, 13:03

Bonjour,
Comme le titre l'indique j'aimerai passer a la programation orientée objet mais je ne sait pas si ca vaut vraiment le coups.

Mammouth du PHP | 19672 Messages

24 juin 2007, 14:00

Ben il faudrait d'abord savoir d'où on part et si c'est intéressant pour l'application que tu veux développer ou non.

Si tu n'as aucune notion de POO, il y a ce sujet où j'ai fait un petit résumé très basique pour situer un peu la manière de l'utiliser. C'est intéressant dans bien des cas et il faut te dire que la plupart des projets professionnels passent par la POO.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 21 Messages

24 juin 2007, 14:42

En fait je me suis mal exprimé.
Ce que j'aimerai savoir c'est si c'est plus utile de faire des classe pour tous par exemple pour envoyé des requette SQL ...

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

24 juin 2007, 14:42

Cela ouvre notamment la porte à l'utilisation de frameworks divers et variés, à l'adoption franche du modèle MVC, à l'application de «bonnes pratiques» de manière plus systématique, etc...
À toi de voir si ça vaut le coup, mais a priori la seule raison pour laquelle ça ne vaudrait pas le coup c'est parce que c'est une application vite fait comme ça, que tu ne comptes pas réitérer l'expérience, encore moins en faire ton métier, et que l'application n'est pas amenée à évoluer trop souvent. Dans tous les autres cas : oui :)

Pour ta seconde question : La POO est une méthode, ce n'est pas un truc magique qui est mieux ou moins bien que ceci ou cela, ou qui «sert» à quelque chose de façon aussi directe que tu sembles l'imaginer.

Eléphanteau du PHP | 21 Messages

24 juin 2007, 16:17

OK donc en fait c'est juste une autre facon de programer si je comprend bien.

Eléphant du PHP | 199 Messages

24 juin 2007, 22:35

Tout à fait, "façon" qui présente bien des avantages. Tout est dans la méthode ;)
Klomac - Blog Lambda

Eléphanteau du PHP | 21 Messages

25 juin 2007, 14:15

Avez vous des éxemples concret par éxemple un petit CMS.
Pour savoir comment procedé

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

25 juin 2007, 15:24

Avez vous des éxemples concret par éxemple un petit CMS.
:lol: :lol: :lol: :lol:
"petit" et "CMS" ça ne va pas bien ensemble :)

Un exemple de POO ce sera plutôt "class Vehicule", "class Voiture extends Vehicule" si tu veux...
Sinon ben... Google ? "Programmation Orientée Objet" ?

Eléphanteau du PHP | 21 Messages

25 juin 2007, 22:32

oui c'est vrai qu'un CMS c'est plutot grand :lol:
En fait j'arrive pas a programmé en orientée objet par éxemple un programme qui afficherai des articles.

Eléphant du PHP | 259 Messages

25 juin 2007, 23:38

Hello,

On va prendre ton idée pour illustrer le probleme :

tu veux afficher des articles genre news, c'est quoi un article ? un titre, un texte, un auteur et une date au minimum. Voila tu as là un objet :
class Article{
  public $titre, $texte, $auteur, $date;
}
jusque là rien de bien intéressant :)

maintenant tu as des contraintes sur ces variables : ta date par exemple doit ressembler à quelque chose, ton titre, dans ta BDD tu as prévu un champ varchar de 150 caractères ? l'objet va gérer cela via les méthodes d'accès aux variables (qu'on appele manipulateurs, ou setters quand on se la pète).
Pour le titre par exemple on va créer une méthode pour définir le titre, généralement appelée set+variable à affecter, soit setTitre. Exemple:
class Article{
  public $titre, $texte, $auteur, $date;

  public function setTitre( $titre ){
    $titre = trim( $titre ); // on efface tous les caractères "blancs" inutiles et pervers
    if( empty( $titre ){
      // là si le titre est vide, l'objet sera invalide, on a plusieurs moyens de le traiter, pour l'instant et pour pas embrouiller le bidule, on va prendre le plus simple on retourne faux, et on laisse le script procédural gérer le bébé.
      return false;
    }
    if( strlen( $titre ) > 150 ) return false; //Là on teste la longueur du titre, s'il est trop grand il va foirer dans la BDD, donc on retourne un faux à la procédure là encore
    // ici on va considérer qu'on a effectué tous les tests indispensables on enregistre donc $titre dans l'objet
    $this->titre = $titre;
    return true; // ici on retourne vrai par acquis de conscience, pour signaler au script que le titre est validé
  }
}
ensuite dans ta procédure tu n'as plus qu'a faire un truc du style :
$monArticle = new Article;
if( $monArticle->setTitre( '  ' ) === false ){
  // tu sais ici que ton titre est invalide, tu peux donc faire tes actions en conséquence.
}
De prime abord, tu vas te dire que ca a pas changé grand chose. Tu as juste déplacé tes tests de variables dans un bidule appelé Objet.

Maintenant essaye d'imaginer comment sera ton code, si tu ne passe pas par cet objet, lorsque tu auras défini tous tes tests pour tous tes champs, et que tu noieras tout cela dans une procédure pour savoir si tu dois l'enregistrer ou pas, réafficher un formulaire, afficher des messages d'erreurs, etc.

En fait tout l'intéret de la POO (dans ce cas de figure) est de te permettre de "ranger" certaines fonctions de maniere intelligente et de rendre tes scripts beaucoup plus lisible après coup, et plus simple à coder parce qu'au moment ou tu crée ton objet, tu n'as pas à t'occuper de ce qui l'entoure, et lorsque tu t'occupe de ce qui l'entoure, tu sais que tu peux faire confiance à ton objet pour te retourner ce que tu attends de lui.

J'espere que cet exemple t'aidera un peu, ou au pire qu'il ne t'ait pas trop embrouillé ;)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

25 juin 2007, 23:40

oui c'est vrai qu'un CMS c'est plutot grand :lol:
En fait j'arrive pas a programmé en orientée objet par éxemple un programme qui afficherai des articles.
Surtout ne vas pas trop vite car il y a tout un long chemin entre
"je n'arrive pas à programmer en POO"
et
"par exemple un programme qui afficherait des articles"
Si tu veux réaliser ton objectif "arriver à coder en POO" il faut commencer par les béabas par exemple comment déclarer des variables (propriétés), leur effecter des valeurs et les afficher dans le cadre d'une classe et ainsi évoluer.
Mais tu dois être rigoureux, encadré et patient pour arriver.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 21 Messages

26 juin 2007, 09:11

Ha super j'ai compris maintenant, je voulait toujour mettre du HTML pour la mise en forme dans ma classe mais dans la classe il faut surtout mettre le code php.
encore merci.
Quand j'essaillait de faire un affichage d'article en POO ca revenait comme si je faisait du procedural dans une classe.

Conclusion : tout n'est pas html ^^

Eléphant du PHP | 199 Messages

26 juin 2007, 09:24

Conclusion : tout n'est pas html ^^
Ca c'est sûr :?
Klomac - Blog Lambda

Eléphant du PHP | 259 Messages

26 juin 2007, 10:24

Hello,

En effet, il y a très peu de relations entre PHP et HTML, hormis quelques fonctions spécifiques et quelques a priori qui font penser que ça fonctionne ensemble :)

En regle générale il faut garder a l'esprit que PHP génère du texte, point barre. S'il y a des tags HTML et un navigateur internet pour les interpreter, ca fera du joli. Mais du point de vue de PHP, c'est du texte.

Eléphanteau du PHP | 21 Messages

26 juin 2007, 13:42

je ne m'en sort pas au niveau des boucles while() j'ai fait plusieurs tests mais ca me genere des boucles infinies donc mon navigateur bugé voici mon code.

c'est un listing des news que je veut afficher
<?php

class news
{

var $id;
var $titre;
var $auteur;
var $texte;
var $date;
var $image;

function listing($nbn)
 {
$query = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT ".$nbn);
while($row = mysql_fetch_assoc($query))
{
$this -> titre = $row['titre'];
}

 }

}

?>
et pour le declarer
$afficher = new news;
$afficher->listing(15);
echo $afficher->titre;