mentral
Messages postés56Date d'inscriptionjeudi 29 mai 2003StatutMembreDernière intervention22 janvier 2008
-
12 juil. 2006 à 08:38
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
13 juil. 2006 à 11:13
Bonjour.
Voici une question d'ordre général : à quoi servent les méthodes statiques en php ? N'étant pas sûr du terme, en voici un exemple :
maClasse::maMéthode()
J'ai l'habitude d'utiliser mes classes de la façon suivante : maClasse->maMéthode() après une instanciation. Où se situe la différence ? Et surtout, quel est l'intérêt des méthodes statiques mis à part le fait de "gagner une ligne" de code en omettant l'instanciation ? Dans quel cas sont-elles les bienvenues par rapport aux méthodes dynamiques ?
Je me pose cette question depuis que je commence à lire le code de frameworks et de CMS opensource existants ; c'est là que j'ai découvert cette syntaxe.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 12 juil. 2006 à 12:39
tout a fait d'accord PaDa, sauf pour les denomination dont je n'ai aucune idée.
On peut assimiler une classe à un modele. L'exemple des poules qui ma bcp fait rire, mais je vais plutot prendre les hommes. On peut voir la chose comme ca:
un homme est caracterisé par:
Couleur de cheveux,
Couleur des yeux,
taille,
sexe,
...
l'interet de creer une classe pour les hommes, c'est que tu as beaucoup d'hommes et qu'ils ont tous une couleur de cheveux, ..., mais ce n'est pas tous la meme.
L'autre interet, c'est que tu peu y ajouter des methodes propres aux hommes, comme par exemple une fonction grand() qui te retourne si l'homme est grand, mais l'implementation est unique a tous les hommes.
Encore un autre interet est l'heritage. tu peu creer 2 autres classes Male et Femelle qui heritent de homme, et qui auront donc une couleur de cheveux, ... sans que tu ai besoin de les redeclarer. Et tu peu en plus ajouter d'autres champs/methodes tels que CouleurRougeALevre, ...
Pour resumer, les classes sont utiles si tu doit instancier plusieurs objets d'un meme modele, ou des objets dont le modele est l'extension d'un autre.
Les fonctions statiques (pas statiques de classe mais statique unique, c'est a dire propre a aucune classe) sont utiles pour des traitements simples independants d'objets. par exemple, une fonction "Carre" qui met un nombre au carre n'a rien a faire dans une classe, ou alors dans une classe "Math", juste pour la lisibilité.
"The difference between static and non static members is only that a non static member is tied to an instance of a class although a static member is tied to the class, and not to a particular instance.
That is, a static member is shared by all instances of a class although a non static member exists for each instance of class."
Autrement dit, une propriété statique est commune à TOUTES LES INSTANCES DE CLASSE.
Imaginons ceci :
<?php
class x {
public static $z = 0;
public $a = 0;
public function plus_un() {
self::$z++;
$this->a++;
}
}
$obj = new x;
$obj2 = new x;
$obj->plus_un();
echo 'a : '.$obj->a.' - z : '.x::$z;
// Affiche : 'a : 1 - z : 1';
$obj2->plus_un();
echo 'a : '.$obj->a.' - z : '.x::$z;
// Affiche : 'a : 1 - z : 2';
?>
Pour tenter de faire encore plus clair, disons qu'une propriété statique est en quelque sorte une variable globale entre toutes les instances d'une même classe.
Ca marche également pour les classes héritières :
<?php
// Classe abstraite
abstract class x {
public $a = 0;
public static $z = 0;
}
// Une classe concrète
class y extends x {
public function plus_un() {
$this->a++;
parent::$z++;
}
}
// Une autre classe concrète
class a extends x {
public function plus_un() {
$this->a++;
parent::$z++;
}
}
$obj = new y;
$obj2 = new a;
$obj->plus_un();
echo 'a : '.$obj->a.' - z : '.x::$z;
// Affiche : 'a : 1 - z : 1';
$obj2->plus_un();
echo 'a : '.$obj->a.' - z : '.x::$z;
// Affiche : 'a : 1 - z : 2';
?>
Et pourtant, ce sont bien 2 instances différentes :)
Voila entre autre une des forces de la programmation objet.
cs_PaDa
Messages postés1804Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention22 septembre 20096 12 juil. 2006 à 09:26
J'espère que je ne vais pas dire de bêtise, mais :
Une méthode statique s'appelle (et est propre) à une classe, non à un objet.
La question n'est pas de gagner une instanciation, c'est juste que ca ne sert pas à la même chose :
Exemple : tu as une classe "Poulet", et une méthode statique "denombrerPoulailler", avec un attribut statique "nbrePoulets"
A chaque instanciation, tu incrémenteras "nbrePoulets", de facon à ce
que "Poulet::denombrerPoulailler" te permette de connaitre le nombre de
"Poulet"(s) qui ont été instanciés.
Ce genre de truc te permet de garder des propriétés utiles à ta classe
et non à un objet, ca évite de faire des trucs tordus pour instancier
un objet à coté qui garderait en mémoire la population du poulailler..
davwart
Messages postés855Date d'inscriptionmardi 19 novembre 2002StatutMembreDernière intervention28 juillet 20091 12 juil. 2006 à 09:27
Si c'est comme en c++ (et je pense que ça l'est), une methode statique peu s'appelle meme si tu n'as pas defini d'objet de ta classe.
par exemple imagine une classe String
prenons une methde statique IntToString(int) qui convertit un int en string
pour eviter que tu doives faire
int a=150;
s=new String;
s=s->IntToSTring(a);
tu peux mettre ta méthode en statique et faire directement : String::IntToString(a);
ca t'evite d'initialiser un object de type String pour utiliser ta méthode.
-------------------------------------
Les ordinateurs, plus on s'en sert moins, moins ça a de chance de mal marcher. [Les Shadoks]
Vous n’avez pas trouvé la réponse que vous recherchez ?
mentral
Messages postés56Date d'inscriptionjeudi 29 mai 2003StatutMembreDernière intervention22 janvier 2008 12 juil. 2006 à 11:07
Merci de vos réponses.
Quelle distinction peut-on faire entre un objet et une classe ? L'objet est-il l'expression ponctuelle d'une classe ?
Je commence à mieux saisir la distinction, mais ne parviens pas à me décider entre statique et dynamique pour coder les composants d'un mini framework.
Exemple : les classes générales du framework (détermination de l'action à exécuter, etc.) peuvent être codées en statique, et les modèles de données en dynamique (ref au MVC) ? Quelle est la limite des méthodes statiques ?
cs_PaDa
Messages postés1804Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention22 septembre 20096 12 juil. 2006 à 11:24
Chien est une classe, mais Médor, qui est une instance de Chien, est un objet :)
Enfin, il y a beaucoup d'abus de langages en POO : on devrait dire
attribut / opération quand on parle de la classe, et champ / méthode
quand on parle de l'objet. Cependant, on utilise souvent attribut et
méthodes pour les deux..
(je n'ai qu'une petite expérience de la POO, par mon cours de Java, si qq1 veut me corriger, qu'il n'hésite pas ;))
mentral
Messages postés56Date d'inscriptionjeudi 29 mai 2003StatutMembreDernière intervention22 janvier 2008 13 juil. 2006 à 10:50
Ok.
Merci bien pour vos réponses. J'aime bien le terme de "lisibilité" utilisé dans ton post, Guillemouze. Je crois que les frameworks que je parcours aiment bien rendre leur structure plus lisible, ou du moins organisée, en multipliant les classes à tout va sans instancier d'objet.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 13 juil. 2006 à 11:13
en plus de ca, ca te permet de declarer plusiuers fois la meme fonction
par exemple
math.carre(x) // pour faire un nombre au carre
geometrie.carre(x) // pour te creer x carres par exemple
mais bien sur ce n'est pas du tout le but de la prog objet, mais c pratique