Passer a la POO

jed
Eléphant du PHP | 218 Messages

26 juin 2007, 15:13

La POO est trés pratique pour traiter un grand nombre d'informations de type différent mais qui doivent subir les mêmes traitements. Dans le cas d'un afficheur d'article, le traitement est assez simple pour se passer de POO. A moins que tu aies plusieurs catégories et sous catégories à traiter, là ça commence à devenir un peu plus interressant de se pencher sur la POO.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 juin 2007, 16:43

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
Tu vois, là tu commence à confondre la notion d'objet et d'occurences d'objets et puis tu oublie que le programme objet doit répondre d'abord à un modèle.

Je m'explique:
Quand tu dis que ta classe est "news" et tu la définit comme ça:
class news 
{ 

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

}
T'as pas le droit (conceptuel) de mettre une méthode (fonction) listing à l'intérieur car l'objet "news" est un élément de listing, puisque "listing" sous-entend: liste de news.
La preuve c'est que la fonction listing fait un "select * from news"
Et l'erreur est d'ailleurs au niveau de cette méthode est de vouloir affecter plusieurs titres extraits de la table "news" dans un seul et même titre de la classe "news".

Pour corriger cette erreur me dirais-tu, il suffit d'utiliser $this->titre[] comme un tableau mais là on rentre en conflit avec le caractère d'unicité de l'objet "news" et on serait ammené à transformer toutes les propriétés en tableau car qui dit plusieurs titres, dit plusieurs id, ...

A mon avis, pour mieux situer les choses un modèle conceptuel est primordial:
D'abord, le mot "news" veut dire "ensemble d'articles ou messages à diffuser"
Nommer donc une classe unitaire "news" n'est pas correct, l'unité est "article" ou "message"
La classe doit être nommée "article" et ses occurences doivent être regroupées dans un conteneur nommé "news".
  • NEWS ------ 1,N ---------> ARTICLE
un article est défini par
class article 
{ 
var $id; 
var $titre; 
var $auteur; 
var $texte; 
var $date; 
var $image; 
}
Et des news sont définis par une association de 1..N articles
class news {
   //tableau de relation news/article (1,N)
     var $articles = array(); 

   //Listing à partir de la base 
    public function listing($nbn=null) { //paramètre facultatif
            //vider le tableau résultat
            $this->articles = array(); 

           //Extraire les articles
           $query = mysql_query("SELECT * FROM news ORDER BY id DESC ".($nbn>0?" LIMIT $nbn":"")); 
            while($row = mysql_fetch_assoc($query)) { 
                //création d'un objet article bien formé
                $un_article = new article();
                $un_article->titre = $row["titre"];
                //idem  pour les autres propriétés

               //Ajout dans la liste des articles à retourner
               $this->articles[] = $un_article; //mise en relation article/news
               
             } //fin while
     //retour du résultat
     return $this->articles;
   }
}
Dans ta classe principale, exécutable, tu pourra déclencher donc l'extraction des news en manipulant simplement la classe news:
//objet de travail
$news =  new news();

//affichage des news
echo "<pre>";
print_r($news->listing()); //tous les articles
echo "</pre>";
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
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, 18:25

J'ai appliqué ces modifications mais j'ai cette erreur au niveau de la recupération des données.

Code : Tout sélectionner

Fatal error: Call to a member function on a non-object in d:\program files\easyphp1-7\www\game-360\index.php on line 12

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 juin 2007, 19:03

Et c'est quoi l'instruction de la ligne 12 dans index.php si ce n'est pas indiscret?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
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, 22:37

print_r($news->listing());
maintenant ca m'affiche 2 message d'erreur

Code : Tout sélectionner

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in d:\program files\easyphp1-7\www\game-360\classe\news.php on line 18
et

Code : Tout sélectionner

Fatal error: Cannot instantiate non-existent class: news in d:\program files\easyphp1-7\www\game-360\index.php on line 9
ce qui veut dire que je vous passe les instruction concernées

ligne 18 /classe/news.php
   public function listing($nbn=null) { //paramètre facultatif 
je ne suis pas sur que je suis avec php5 (public qui foirerait) j'utilise easyphp.

ligne 9 /index.php
$afficher = new news;

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 juin 2007, 22:50

Effectivement public est supporté par PHP5, sous easyphp tu l'enlève.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 21 Messages

27 juin 2007, 09:05

maintenant que j'ai retiré public cette ligne d'erreur (la meme que j'avais au debut).

Code : Tout sélectionner

Fatal error: Call to a member function on a non-object in d:\program files\easyphp1-7\www\game-360\index.php on line 12
ma ligne 12 est toujours

Code : Tout sélectionner

print_r($news->listing());

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 13:23

C'est normal il faut ouvrir les yeux, ton objet s'appelle $afficher et non $news:
$afficher = new news;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 21 Messages

27 juin 2007, 17:46

c'etait juste devant mes yeux mais je cerchait dans la class des erreur et evidement il n'y en avait pas :lol:
donc ca m'affiche ceci, super.

est ce que je peut utilisé les donnée séparément avec des boucles ?

Code : Tout sélectionner

Array ( [0] => article Object ( [id] => [titre] => news2 [auteur] => [texte] => [date] => [image] => ) [1] => article Object ( [id] => [titre] => news1 [auteur] => [texte] => [date] => [image] => ) )

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 23:16

Bien sur, et c'est plus rapide que de réinterroger la base car comme ça ta table est dans la mémoire.

Exemple:
//récupèrer les news de la base dans le tableau $news
$news = $afficher->listing();

//Le parcourir
if (is_array($news) && count($news)>0){
     //afficher un par un les articles
     foreach ($news as $index=>$article){
         echo $article->titre . "<br />";
     }
}
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 21 Messages

28 juin 2007, 12:41

Ca marche super bien.
C'est genial, maintanant je dis au revoir au procedural...

Merci sadeq