Définition de classes

Mammouth du PHP | 843 Messages

27 mai 2007, 16:07

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 :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 199 Messages

27 mai 2007, 17:52

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 :)
Klomac - Blog Lambda

jed
Eléphant du PHP | 218 Messages

27 mai 2007, 17:59

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]
Modifié en dernier par jed le 27 mai 2007, 18:17, modifié 1 fois.

Mammouth du PHP | 19672 Messages

27 mai 2007, 18:02

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

28 mai 2007, 08:09

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 ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

jed
Eléphant du PHP | 218 Messages

28 mai 2007, 09:13

comme quoi un exemple simple et concret, c'est le top.
Ah... bon... désolé, et au plaisir. :mrgreen:

Mammouth du PHP | 843 Messages

28 mai 2007, 14:52

rassure toi ton template va aussi beaucoup m'aider ;)
comme quoi d'une pierre de deux coups :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 199 Messages

28 mai 2007, 15:21

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).
Klomac - Blog Lambda

Mammouth du PHP | 843 Messages

28 mai 2007, 17:19

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
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 259 Messages

28 mai 2007, 17:36

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 ! :)

Eléphant du PHP | 199 Messages

28 mai 2007, 17:59

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).
Klomac - Blog Lambda

Mammouth du PHP | 843 Messages

03 juin 2007, 01:47

dans l'exemple de calculatrice, cyrano ecrit @return Float, @param Float $n1, @var Float... en commentaire, pourquoi ?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 5924 Messages

03 juin 2007, 02:46

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.

Mammouth du PHP | 19672 Messages

03 juin 2007, 08:03

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 505 Messages

03 juin 2007, 12:14

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