Passer a la POO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Passer a la POO

par Clement » 28 juin 2007, 12:41

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

Merci sadeq

par sadeq » 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 />";
     }
}

par Clement » 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] => ) )

par sadeq » 27 juin 2007, 13:23

C'est normal il faut ouvrir les yeux, ton objet s'appelle $afficher et non $news:
$afficher = new news;

par Clement » 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());

par sadeq » 26 juin 2007, 22:50

Effectivement public est supporté par PHP5, sous easyphp tu l'enlève.

par Clement » 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;

par sadeq » 26 juin 2007, 19:03

Et c'est quoi l'instruction de la ligne 12 dans index.php si ce n'est pas indiscret?

par Clement » 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

par sadeq » 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>";

par jed » 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.

par Clement » 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;

par Jules Petibidon » 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.

par Klomac » 26 juin 2007, 09:24

Conclusion : tout n'est pas html ^^
Ca c'est sûr :?

par Clement » 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 ^^