8792 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,
J'essaye d'apprendre les class. J'ai quelques petites questions.

1) Quand faut-il utiliser les class ? On dit partout qu'on peut les utiliser tout le temps mais bon ça m'avance pas.

2) Est-ce utile d'utiliser une class pour se connecter à une SGBD comme mysql par exemple ? Si oui, faut-il aussi mettre une fonction qui permette de traiter les requetes dans la meme class ou on peut l'écrire directement dans le programme.

3) On voit des class où c'est écrit function __Construct() et aussi où il y a une fonction destruct enfin je ne sais plus le nom. Pourquoi ?
Modifié par raffoul (17 May 2007 - 11:02)
Salut,

raffoul a écrit :
1) Quand faut-il utiliser les class ? On dit partout qu'on peut les utiliser tout le temps mais bon ça m'avance pas.

L'intérêt de la programmation orienté objet (POO pour ceux qui sont in Smiley biggrin ) est de créer des "briques logicielles" qui peuvent être réutilisées dans différents programmes. Cela t'évite ainsi de devoir récrire des méthodes que tu as déjà utilisé pour d'autre applications.
Tu peux ainsi créer une classe lorsque celle-ci peut te reservir pour un autre site web.
L'autre avantage des classes est d'être plus lisible et donc plus facile à maintenir que du code "normal" (il y a un mot précis mais je ne le trouve plus Smiley decu ).

raffoul a écrit :
2) Est-ce utile d'utiliser une class pour se connecter à une SGBD comme mysql par exemple ?

Une classe pour se connecter à un SGBD est l'exemple typique du pourquoi l'utilisation d'une classe. En effet, cette classe est utilie pour tout tes développements web.

raffoul a écrit :
Si oui, faut-il aussi mettre une fonction qui permette de traiter les requetes dans la meme class ou on peut l'écrire directement dans le programme.

Là tu est totalement libre de concevoir ton propre système de gestion de base de données. Personnellement, je préfère que mes requêtes soient effectuées par une méthode de ma classe MySql. Je trouve cela plus logique. Mais bon, tu es libre de faire comme tu le sens.

raffoul a écrit :
3) On voit des class où c'est écrit function __Construct() et aussi où il y a une fonction destruct enfin je ne sais plus le nom. Pourquoi ?

Là je te conseille d'aller faire un petit tour sur ces liens qui t'expliqueront mieux que moi ces concepts :
PHP: Constructeurs et destructeurs - Manual
Constructeurs et destructeurs en java

J'éspère que cela t'aidera à comprendre et d'y voir plus clair Smiley cligne
a écrit :
(il y a un mot précis mais je ne le trouve plus Smiley decu ).


Maintenabilité et évolutivité, je présume Smiley cligne .
Merci beaucoup. Ca a l'air d'être vraiment intéressant les class.C'est déjà un peu plus clair maintenant Smiley smile

Pour le système constructeurs - destructeurs, par exemple, dans le cas d'une class MySQL, dans le constructeur, on ferait la connexion à mysql et dans le destructeur la déconnexion ? En faite, si j'ai bien compris, le destructeur permet d'effacer tous les objets qu'on a créé avant ?

Exemple :
- si on crée une maison bleu avec un portail rouge dans le constructeur
- dans le destructeur on supprime la maison

J'ai envie que ce soit vraiment clair dans ma tête. Si j'ai bien compris, je vais me lancer par construire ma 1ère class.
Le constructeur permet d'instancier (de créer) des objets contenant des propriétés (caractèristiques) et des méthodes (actions). Dans ces dernières, on trouve le plus souvent des accesseurs (méthodes permettant de récupérer une propriété de l'objet et/ou de modifier une propriété) et des méthodes réalisant des traitements plus spécifiques.

Le destructeur permet de détruire une instance de l'objet.

La POO est très intéressante/puissante à condition de bien comprendre ce que l'on fait ; n'hésite donc pas à bien lire des tutos & autres pour bien comprendre le mécanisme Smiley cligne .
Modifié par yodaswii (14 May 2007 - 16:40)
Merci Maitre Yoda Smiley cligne . En faite, j'avais acheté un livre spécialement pour continuer à apprendre le php et surtout les class mais il me manque 40 pages au milieu du livre et comme par hasard, ce sont celles sur les class lol. A la librairie ils vont me l'échanger mais ils n'en ont plus en stock :'(. Galere galere. Merci en tout cas, je vais commencer par faire des petites class pour bien comprendre le système et lire des tutos.
J'ai une nouvelle question.
Peut-on donner un autre nom que __construct() pour un constructeur ?
Salut,

on peut donner aussi le nom de la classe.

maClasse() {} est un constructeur de la classe maClasse de surcroit valide avec PHP4.

sinon tu ne peux pas mettre n'importequoi.

pascal
Modifié par CPascal (15 May 2007 - 22:12)
Merci

N'importe quoi ?
Les règles sont les mêmes que pour les fonctions non présentes dans les class je suppose.
Modifié par raffoul (15 May 2007 - 22:13)
OK Smiley cligne

J'ai une autre question comme je suis entrain de m'entrainer là Smiley cligne

Un destructeur est-il indispensable dès qu'on a un constructeur ?
Si oui, il faut mettre quoi dedans ?
bon je suis pas si grand specialiste

un destructeur n'est pas obligatoire autant que je sache.

tu pourrais mettre des unset de variables ( c'est le principal interêt pour liberer de l'espace mémoire) où des messages t'informant de la destruction de l'objet ( pour debugger par exemple ). ou autre chose selon les besoins. de la sauvegarde dans un fichier de données par exemple
Voilà, j'ai écris ma première class ce soir. J'ai déjà remarqué quelque chose de sympa dans les classes : la séparation code / design et la modification du contenu sans touché au design. Bref.
Cette class récupère les données sur un article contenu dans un fichier xml, et extrait les données de ce fichier xml appelé dernier_article.xml. Ce fichier contient l'article le plus récent à afficher sur la page d'accueil. Donc j'aurais aimé savoir ce que vous pensiez de ma première class et surtout les erreurs à ne pas comettre, des points de sécurité essentiel, la gestion des erreurs, si j'ai fais des choses inutiles ou si je m'y suis mal pris. Tout ce que je peux dire, c'est qu'elle fonctionne car je l'ai testé.

J'ai également une question :
- Quand faut-il mettre public ou private devant le nom d'une fonction ?


// Class : dernierArticle
// Permet l'affichage du dernier article sur la page d'accueil à partir d'un fichier xml


class dernierArticle{
	var $titre; // Titre de l'article
	var $rubrique; // Rubrique de l'article
	var $dateA; // Date de l'article
	var $photo; // Photo de l'article
	var $legende; // Légende de la photo
	var $citation; // Citation
	var $debut; // Début de l'article
	var $lien; // Lien vers l'article
	var $txtlien; // Texte du lien


    ////////////////////////////////////////////////////////////////////////
	// Constructeur de class                                              //
	//                                                                    //
	// Paramètres :                                                       //
	// @ source_xml : source du fichier xml contenant le dernier article  // 
	////////////////////////////////////////////////////////////////////////
	
	public function __construct($source_xml){
	
		////// Création et chargement du document DOM ///////
		$dom = new DOMDocument;
		$dom->load($source_xml) or die('Fichier xml corrompu !');
		
		if (!@$dom->validate()) // si fichier invalide, traitement de l'erreur
			{
			echo 'Fichier '.$source_xml.' est invalide';
			die();
			}
			
		
		///////// Titre de l'article /////////
		/* récupération du titre de l'article via xml, on fait la même opération chaque partie de l'article */
		$this -> titre = $dom -> getElementsByTagName('titre') -> item(0) -> nodeValue;
		/* décodage pour afficher les accents, utilisé seulement pour les parties possédant des accents, les autres n'ont pas été codés */
		$this -> titre = utf8_decode($this -> titre);

		
		//////// Rubrique associé à l'article //////////
		$this -> rubrique = $dom->getElementsByTagName('rubrique') -> item(0) -> nodeValue;
		$this -> rubrique = utf8_decode($this -> rubrique);
		
		
		/////// Date de publication de l'article ////////
		$this -> dateA = $dom -> getElementsByTagName('date') -> item(0) -> nodeValue;
		
		
		/////////// Photo associé à l'article (url)  ////////////
		$this -> photo = $dom -> getElementsByTagName('photo') -> item(0) -> nodeValue;
		
		
		///// Légende associé à la photo de l'article //////
		$this -> legende = $dom -> getElementsByTagName('legende') -> item(0) -> nodeValue;
		$this -> legende = utf8_decode($this -> legende);
		
		
		////  Citation à placé au début de l'article ////
		$this -> citation = $dom -> getElementsByTagName('citation') -> item(0) -> nodeValue;
		$this -> citation = utf8_decode($this -> citation);
		
		
		///// Début de l'article pour mettre en appétit le visiteur /////
		$this -> debut = $dom -> getElementsByTagName('debut') -> item(0) -> nodeValue;
		$this -> debut = utf8_decode($this -> debut);
		
		
		////// Lien vers l'article complet ////////
		$this -> lien = $dom -> getElementsByTagName('lien') -> item(0) -> nodeValue;
		
		
		///////// Texte du lien à afficher (associé au lien ci-dessus) ///////////
		$this -> txtlien = $dom -> getElementsByTagName('txtlien') -> item(0) -> nodeValue;
		$this -> txtlien = utf8_decode($this -> txtlien);
    }
	
	// destructeur de class
	function __destruct(){
		unset($this -> titre, $this -> rubrique, $this -> dateA, $this -> photo, $this -> legende, $this -> citation, $this -> debut, $this -> lien, $this -> txtlien);
	}
}


Là que jsuis en vacances Smiley biggrin j'en profite pour travailer et quand je vais rentré en cours l'année prochaine, je serais une vraie bête Smiley biggrin .
Salut
Pour une 1ère classe, on va dire que c'est bien, mais forcément pas top Smiley cligne
Dans quelques temps, tu voudras faire une classe similaire, non pas sur des actus, mais sur un autre domaine. Tu vas donc créer une classe similaire, où tu feras exactement les mêmes actions, au nom des balises près. Une bonne chose à faire est d'abstraire un peu tout ça pour avoir une classe de gestion XML (classe abstraite, donc), que tu vas dériver (héritage) pour la spécialiser dans la gestion d'un xml contenant une actu (je te laisse peaufiner ton apprentissage de l'héritage avant d'en dire plus).

Ensuite, question gestion d'erreur, c'est pas top non plus. Le or die, perso je trouve ça crade. C'est bien pour faire un exemple dans un tuto sur une fonction, mais en dev, ça fait négligé. On tue le process au beau milieu, tant pis pour la libération mémoire, et on obtient une page non-valide.
Que faire ? Gérer l'état de ton objet. Comment ? Le plus simple, c'est avec une donnée membre de type booléen (ici, dom valide ou non), que tu vas tester dans chaque méthode. Le plus élégant ? Utiliser le pattern état (ou handle/body), mais là ça devient pointu pour un néophyte. Je te donnerai quelques indications selon ta curiosité sur le sujet.
Ensuite, généraliser quelques méthodes, comme la récupération des infos :

private function getTag ($tag, $decode = false)
{
    $resultat = false;
    if ($this->estValide())
    {
        // avec test sur le tag
        $resultat = $this -> dom -> getElementsByTagName($tag) -> item(0) -> nodeValue;
        if ($decode)
        {
            $resultat = uft8_decode($resultat);
        }
    }
    return $resultat;
}

avec une déclaration de constante genre define ('DOM_DECODE',true) pour plus de lisibilité quand tu appelleras la fonction. La méthode estValide teste si le dom est valide.

Pour les méthodes private/public, tout dépend de la visibilité que tu veux leur donner. Si une méthode est accessible de l'extérieur, elle sera public. Si elle ne doit être appelée que par l'objet en interne, elle sera private. Exemple (légèrement osé Smiley confused ) :
une classe Fille avec 2 méthodes :

faireLaBise()
toucherLesFesses()

bah faireLaBise, c'est public, toucherLesFesses, c'est privé, il n'y a que la fille en question qui a le droit (ou alors, des classes amies, à qui elle aurait autorisé cette action Smiley lol ).

J'espère que c'était clair
A+

[ edit ]
Correction du code : $dom doit être une donnée membre de la classe, d'où $this->dom
Modifié par jeje (16 May 2007 - 09:38)
Salut,

jeje a écrit :
Ensuite, question gestion d'erreur, c'est pas top non plus. Le or die, perso je trouve ça crade. C'est bien pour faire un exemple dans un tuto sur une fonction, mais en dev, ça fait négligé.

Tout à fait d'accord avec toi. Utiliser le or die en développement est vraiement déconseiller.
Une autre solution pour gérer les erreurs de façon "stylé" est d'utiliser les exceptions. PHP5 nous offre un système de gestion d'exception vraiment intéressant et il serait dommage de s'en priver.

jeje a écrit :
utiliser le pattern état (ou handle/body), mais là ça devient pointu pour un néophyte

Aurais tu des liens ou des infos à propos de ce pattern parce que je ne le connaissais pas et je suis curieux de le découvrir.

raffoul a écrit :
Quand faut-il mettre public ou private devant le nom d'une fonction ?

N'oublies pas également que ces modificateurs sont également disponibles pour les attributs. Il existe également protected mais que tu découviras lors de ton apprentissage de l'héritage.
En général, les attributs d'une classe sont toujours private pour une raison de sécurité. En effet, il est fortement déconseiller de donner la possiblité de modifier un attribut en dehors de la classe. Il existe pour cela des méthodes (appelées mutateurs/modificateurs) qui se chargent de cela. L'intérêt de ce système est de pouvoir contrôler les modifications apportées à un attribut. Par exemple, dans une classe Vehicule, tu as un attribut nbRoues. Si nbRoues est public tu peux faire cela :

$v = new Vehicule();
$v->nbRoues = 0;

Or avec un attribut private cela est impossible est tu peux contrôler :

class Vehicule {
  private $nbRoues;

  public function setNbRoues($nb) {
    if ($nb < 2) {
      // afficher une erreur
    } else {
      $this->nbRoues = $nb;
     }
  }
}


J'éspère que cela a été clair et t'aidera à comprendre. Smiley cligne
Modifié par ymhotepa (16 May 2007 - 09:48)
@jeje & @ymhotepa : la POO demande du temps (dans son application et dans sa compréhension) ; inutile de lui "balancer" des tas de code ... Il faut laisser décanter le tout et raffoul vous fera signe si il a d'autres interrogations ou incompréhensions.
ymhotepa a écrit :

Aurais tu des liens ou des infos à propos de ce pattern parce que je ne le connaissais pas et je suis curieux de le découvrir.

J'en ai un en C++ sur developpez.com :
Améliorez vos logiciels avec le pattern Etat

Pour le handle/body, ça me semble plus simple. Désolé, je vais parler en C++ :
- la classe Handle dispose d'un pointeur vers un Body (virtuel) définissant l'interface, dont héritent les bodies concrets (les différents états).
- le handle définit la même interface que le body, et lui délègue les appels.

Un exemple en php (4, désolé). Je préfixe les noms par leur type, p pour pointeur, c'est faux ici mais j'ai gardé cette notion du C++

Class Handle
{
    var $p_body;
    function Handle ($fichier)
    {
        p_body = null;
        $dom = new DOMDocument;
        if ($dom->load($fichier))
        {
            $this->p_body = new XmlValide($dom);
        }
        else
        {
            $this->p_body = new XmlInvalide();
        }
    }

    function asString ()
    {
        $resultat = false;
        if (!is_null(p_body)) // ou is_a Body
        {
            $resultat = p_body->asString();
        }
        return $resultat;
    }
}


L'interface Body :

class Body
{
    function asString() {} // virtuelle
}


Body XML invalide

class XmlInvalide
{
    function asString ()
    {
        return false;
    }
}


Body XML valide

class XmlValide
{
    var $o_dom; // initialisé dans constructeur
    function asString ()
    {
        return $this->o_dom->serialize();
    }
}


Et voilà, que le doc XML soit valide ou non, même pas mal, le script fonctionne toujours. Très puissant quand on a beaucoup de contextes à gérer.


@yodaswii :
des tas de code... où ça ? Smiley fut
Sérieusement, je n'aime pas brider les gens. C'est à lui de dire stop si ça devient trop ardu.
Mais d'accord sur ce dernier post, il peut l'ignorer pour l'instant Smiley cligne (il s'adresse surtout à ymhotepa)
a écrit :
des tas de code... où ça ? Smiley fut

En effet, il y'a peu de code mais ce genre de discussions part souvent vers des "démonstrations de forces" Smiley cligne . C'était juste pour éviter ce débordement.

a écrit :
Sérieusement, je n'aime pas brider les gens. C'est à lui de dire stop si ça devient trop ardu.


D'expérience, les gens ne te diront jamais stop Smiley smile .
Modifié par yodaswii (16 May 2007 - 10:37)
@jeje : Merci pour ce lien et cette petite présentation. Je vais regarder tout ca. Smiley cligne

@yodaswii : Tu as raisons, je pense que maitenant il a toutes les infos pour bien commencer en poo. On va y aller plus cool Smiley langue Smiley cligne
Vous êtes trop des stars, je suis en admiration. Merci beaucoup. Je vais essayer d'améliorer mon programme et je vous refait signe.

Et merci pour l'exemple Faire la bise / Toucher les fesse Smiley biggrin mdr, ca m'a bien aidé à comprendre même si pour moi Toucher les fesses, c'est public lol.

Petite question hors du sujet :
- vous avez mis combien de temps à apprendre tout ça ?
- vous avez tout appris avec des bouquins ou vous avez suivi des cours ?

Bon fini de rigoler, je retourne au bouloeau car j'ai envie de devenir aussi fort que vous.
Pages :