Page 1 sur 2

Définition de classes

Posté : 27 mai 2007, 16:07
par BeRoots
salut à tous :)

est ce que quelqu'un peut m'expliquer de façon simple une methode de travail pour la mise en place de classes pour un projet web

j'ai deja definit pas mal de fonction tant coté system, affichage, alternate style sheet,...

maintenant j'aimerai savoir comment et pour quel raison definir des classes.
je suppose que c'est pour differencier et regrouper chaque fonctions de même ordre... mais bon :?

si quelqu'un peut m'expliquer une methode simple afin de m'orienter vers une definition de classe en vue d'une POO ;)

en claire une simple description d'une methode de travail exemple serai deja un bon point de depart.

mille merci d'avance :)

Posté : 27 mai 2007, 17:52
par Klomac
Je ne suis pas un expert mais je dirais que l'utilité des classes vis à vis des simples fonctions c'est de pouvoir définir une architecture (un squelette) entre tes fonctions. Après je pense qu'on a des utilisateurs expérimentés sur ce forum qui t'en diront plus que moi :)

Posté : 27 mai 2007, 17:59
par jed
Salut, il est un peu difficile de t'aider si on ne sait pas exactement ce que tu veux faire: si il s'agit d'un système de templates il existe des librairies mais je ne connais pas leur nom, google t'aidera.
Un aperçu trés simpliste (j'ai pas testé c'est assez incomplet) de comment peut se coder un système de tempates:

fichier: class_templates.php
class template
{
	public $tpl = '';
	private $path = 'templates/'; //chemin des templates a éditer

	public function __construct ($tplfile)
	{
		if (!file_exists("$this->path.$tplfile.tpl")) exit;
		else
		{
			$tpl = $this->load ("$this->path.$tplfile.tpl");
			if (!empty($tpl)) $this->tpl = $tpl;
		}
	}
	
	public function get ($datas=array())
	{
		if (!empty($this->tpl) && !empty($datas))
		{
			$this->tpl = $this->replacevars($this->tpl, $datas);
		}
	}
	
	public function output ($datas=array())
	{
		if (!empty($this->tpl) && !empty($datas))
		{
			$this->tpl = $this->replacevars($this->tpl, $datas);
			print ($this->tpl);
		}
	}
	
	private function load ($tplfile)
	{
		$handle = @fopen($tplfile, "rb");
		$content = @fread ($handle, filesize($tplfile));
		fclose ($handle);
		return $content;
	}
	
	private function replacevars ($tplfile, $datas)
	{
		while ( list ($key,$val) = each ($datas) )
		{
			if (!empty($key)) $template = str_replace("\{$key\}","$val","$tplfile");
		}
		return $template;
	}
};

?>
Tu peux ensuite soit stocker ton html parsé dans une variable ou soit l'afficher directement:

fichier: index.php
<?php

$index = new template ("index");
$datas['pagetitle'] = 'index';

$var = $index->get($datas);
//OU
$index->output($datas);

?>
et enfin, voila un exemple de contenu d'un template:

fichier: index.tpl
<html>
	<head>
		<title>
			{pagetitle}
		</title>
	</head>
	....
Tu peux suivre ce principe mais il en existe d'autres. Voilà j'espère avoir répondu à ta question. ;)[/code]

Posté : 27 mai 2007, 18:02
par Cyrano
Salut,
je vais essayer de te présenter une approche de la POO. Il te restera à adapter selon les besoins auxquels tu feras face au fil du temps.

Imagines que tu aies besoin d'effectuer une opération de base, addition, soustraction, etc... : de quoi as-tu besoin ? Les esprits caustiques diront : un peu de calcul mental, ok, laissons de coté ces brillants cerveaux et restons dans la programmation : tu as besoin d'une calculatrice. Ton objet est donc une calculatrice. Tu dois définir certains éléments de cette calculatrice :
- D'abord des propriétés : tu dois faire des calculs à partir de nombres. Ces nombres seront les propriétés de ta calculatrice, et nous en aurons au minimum deux. On pourrait se contenter d'un seul pour d'autres opérations, mais laissons ça de coté pour l'instant.
- Ensuite des méthodes : il faut pouvoir multiplier, additionner, soustraire ou diviser.

Et quand tu as besoin de faire un opération, tu prends l'objet (la calculatrice), tu lui indiques sur quels nombres tu veux calculer et tu lui demande d'effectuer une opération, en retour de quoi, l'appel de cette opération te retourne le résultat.

Alors voici quelque chose de très basique, mais voyons un peu de mise en pratique :
<?php
/**
 * Classe de calculatrice de base.
 */
class calculs
{
    /**
     * On commence par définir les propriétés.
     */
    /**
     * Valeur du premier nombre
     *
     * @var Float
     */
    private $premiernombre;
    
    /**
     * Valeur du second nombre
     *
     * @var Float
     */
    private $secondnombre;
    
    /**
     * Constructeur.
     * 
     * Définit les nombres sur lesquels on fera des calculs.
     *
     * @param Float $n1
     * @param Float $n2
     */
    public function __construct($n1, $n2)
    {
        $this->premiernombre = $n1;
        $this->secondnombre  = $n2;
    }

    /**
     * Addition du premier et du second nombre.
     *
     * @return Float
     */
    public function addition()
    {
        return $this->premiernombre + $this->secondnombre;
    }
    
    /**
     * Soustraction du second nombre au premier nombre.
     *
     * @return Float
     */
    public function soustraction()
    {
        return $this->premiernombre - $this->secondnombre;
    }
    
    /**
     * Multiplication du premier par le second nombre.
     *
     * @return Float
     */
    public function multiplication()
    {
        return $this->premiernombre * $this->secondnombre;
    }
    
    /**
     * Division du premier par le second nombre.
     *
     * @return Float
     */
    public function division()
    {
        return $this->premiernombre / $this->secondnombre;
    }
}
?>
Comment ça fonctionne ?
Au cours de ton programme, tu as défini deux nombres et tu as besoin d'effectuer un calcul dessus. Tu prends ta calculatrice : en terme de POO, tu vas créer "une instance de la classe calcul" : pour ça, on utilise "new" et on crée une variable qui va contenir notre objet :
<?php
$nombre1 = 123;
$nombre2 = 456;
$calculatrice = new calculs($nombre1, $nombre2);
?>
New va appeler le constructeur de la classe : il attend deux paramètres, nos deux nombres.

Maintenant, notre calculatrice est prête et on veut par exemple le total des deux nombres : on va appeler une méthode correspondante de la classe, avec la syntaxe objet->methode() :
$total = $calculatrice->addition();
Il ne reste qu'à utiliser notre variable $total qui contient le résultat.

Je te laisse faire des essais et affiner tes questions.

Posté : 28 mai 2007, 08:09
par BeRoots
y'a des matins, comme ça, on ce leve et tout devient plus claire :D
mille merci Cyrano pour l'exemple, plus claire en tous cas expliquer comme cela que ce que j' en ai compris de PHP5avancée.
comme quoi un exemple simple et concret, c'est le top.
je vais essayer de commencer par soulager mon code des fonction les plus lourdes afin de simplifier un peu tout ça et je vous tient au jus si besoin ;)

Posté : 28 mai 2007, 09:13
par jed
comme quoi un exemple simple et concret, c'est le top.
Ah... bon... désolé, et au plaisir. :mrgreen:

Posté : 28 mai 2007, 14:52
par BeRoots
rassure toi ton template va aussi beaucoup m'aider ;)
comme quoi d'une pierre de deux coups :)

Posté : 28 mai 2007, 15:21
par Klomac
Je ne sais pas si ça va t'aider mais je te propose de regarder quelques classes que j'ai mises en ligne récemment. La première gère un système de mise en cache assez basique (LambdaCache) et les trois autres gèrent un système de templates, la première ressemblant un peu à celle proposée par jed, à quelques détails près (LambdaTemplates).

Posté : 28 mai 2007, 17:19
par BeRoots
je suis en train de voir pour faire une class dbconnection afin de simplifier la definition de mes connexions au db...

j'ai vue ceci dans la doc mais je comprend pas trop l'utilisation :?
<?php
class dbonnection {
    protected $link;
    private $server, $username, $password, $db;

    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

    public function __sleep()
    {
        mysql_close($this->link);
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
?> 
1°) si quelqu'un peut m'expliquer pour utiliser cette classe ;)
2°) j'aimerai aussi savor comment deuvent être definit les parametres de connextion et si il est possible de les recuperer depuis cette même class afin que celle ci devienne "independante":-k (je suppose que c'est soit en dur, soit en require_once avant de les definir)

merci d'avance pour vos explication

Posté : 28 mai 2007, 17:36
par Jules Petibidon
hello,

t'expliquer la fonction de cette classe retirerait une bonne partie de son intéret ;)

essaye de comprendre cela tout seul.

etape 1 -> la fonction __construct() et ses parametres...

etape 2 -> la relation entre les méthodes et les membres ( fonctions et variables de classe )

etape 3 -> mais kékéfont ces méthodes __sleep() et __wakeup() ?

cela te permettra de comprendre quelques petites choses à propos de la POO...
et de là, tu sauras comment l'utiliser et surtout si elle peut te servir à quelque chose.

Bon courage ! :)

Posté : 28 mai 2007, 17:59
par Klomac
Comme exercice pédagogique, décortiquer cette classe me semble assez utile, y'a quelques notions (comme le constructeur, les méthodes magiques, les variables privées...) qui entrent en jeu.

Par contre en pratique cette classe est assez (très ?) inutile ;) Si tu veux associer MySQL et POO, autant te servir des outils à disposition (http://fr.php.net/mysqli).

Posté : 03 juin 2007, 01:47
par BeRoots
dans l'exemple de calculatrice, cyrano ecrit @return Float, @param Float $n1, @var Float... en commentaire, pourquoi ?

Posté : 03 juin 2007, 02:46
par Sékiltoyai
Ce sont des informations sur les fonctions, les prototypes des fonctions contenant peu d'information, on spécifie de cette manière les types des arguments, des valeurs de retour, ainsi que des annotations sur le rôle de chaque argument dans la fonction.
Ces méta informations sont utilisées et définies par les générateurs de documentation de type PHPDoc.

Posté : 03 juin 2007, 08:03
par Cyrano
dans l'exemple de calculatrice, cyrano ecrit @return Float, @param Float $n1, @var Float... en commentaire, pourquoi ?
Comme vient de le préciser Sékiltokay, c'est une notation conventionnelle qui est utilisée par PHPDocumentor pour générer une documentation à la volée, documentation qui sera utilisée par la suite par les développeur et/ou les utilisateurs de tes classes.

Ces commentaires sont très importants : ça peut paraître fastidieux, mais c'est une discipline à adopter d'abord parce que c'est utilisé pour la documentation et ensuite, quand tu viens de l'écrire, ton code est bien frais dans ta tête, mais si tu dois y apporter des correctifs plusieurs mois après, il est très utile de ne pas devoir décortiquer tout ça pendant des heures (jour?) pour comprendre le déroulement.

Voir le manuel d'utilisation de PHPDocumentor

Posté : 03 juin 2007, 12:14
par titerm
Un autre interret de ces commentaires est quand tu utilises un IDE comme, zend Studio, eclipse pdt ou le futur zend Neon, c'est qu'il t'affiche automatiquement le prototype lors de la complétion automatique.

de meme quand tu indiques @return ClassName, tu aura égalementy la completion automatique sur la variable
class toto {
/**
 * @return ArrayObject
 */
function  test () {
 return new ArrayObject() ;
}
function test2() {
 return new ArrayIterator() ;
}
}

$foo = new toto();
$ar = foo->test();

$ar-> // et la tu a automatiquement la completion sur toute les propriétés et methodes de ArrayObject. Si tu ne met pas le @return, tu peux toujours le faire via un @var juste apres l'affectation.

$ai = $toto->test2();
/* @var  $ai ArrayIterator */
$ai-> //Completion active grave au @var