Méthodes statiques [Résolu]

Signaler
Messages postés
56
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 janvier 2008
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
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.

Merci.

[ NemetraL ]

8 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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é.

j'espere t'avoir eclairé plus qu'embrouillé ;)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
http://fr3.php.net/manual/fr/language.oop5.static.php

"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.
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
4
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..


J'espère avoir pu t'aider un peu, cdt,


Pada
Messages postés
855
Date d'inscription
mardi 19 novembre 2002
Statut
Membre
Dernière intervention
28 juillet 2009
1
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]
Messages postés
56
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 janvier 2008

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 ?

Merci.

[ NemetraL ]
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
4
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 ;))


Pada
Messages postés
56
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 janvier 2008

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.

[ NemetraL ]
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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