méthodes bde classes et d'objets

Eléphant du PHP | 107 Messages

07 juil. 2011, 03:49

Bonjour à tous,

en php objet, on peut à priori appeler une méthode de manière statique(::) ou en instanciant un objet avant (->)
comment choisir quand utiliser quoi?

merci à tous pour vos réponses.

Eléphant du PHP | 209 Messages

07 juil. 2011, 07:50

Bonjour,

Dans un objet, il y a les méthodes statiques défini avec le mot clé static devant et les méthodes de l'objet :
class MaClasse {
	
	public static function maFonctionStatic(){
	}

	public function maFonction(){
	}

}
Dans ce cas, et bien que PHP permettent d'executer les méthodes n'importe comment, il convient pour une meilleur lecture du code de faire :
MaClass::maFonctionStatic();

$maClasse = new MaClasse();
$maClasse->maFonction();
C'est à dire d'utiliser l'opérateur de résolution de portée (::) sur les méthodes statiques, et l'opérateur de déréférencement (->) pour les méthodes non statiques.


Quand à savoir s'il faut développer une méthode statique ou pas, la réponse est, quand on débute en POO : ne pas utiliser de méthode statique !
Les méthodes statiques sont très proches des fonctions du développement procédurale, et si on vient de ce monde, il y a un gros risque pour que l'on
croit faire de l'objet alors qu'on en fait pas...
--
Eric

Eléphant du PHP | 107 Messages

07 juil. 2011, 13:10

merci bcp pour cet éclairage très utile.
Ya til des clés ou des questions fondamentales à se poser avant de décider si une fonction doit être statique ou non?

devlop78
Invité n'ayant pas de compte PHPfrance

08 juil. 2011, 05:08

C'est difficile à dire, et peu de réponses à ce sujet sur internet. Je parle plus globalement, sur des choix judicieux de programmation POO.

Pour statique ou objet, tu peux te poser des questions sur ta classe (je parle là sur une classe entière) :

- ma classe a-t-elle une vie (est-elle crée, détruire, les méthodes a l'intérieur suivent-elles une chronologie, une logique entre elles, ...) ? Si oui, ce sera un objet.

- ma classe offre-t-elle des outils pour les autres classes (tel qu'une addition) ? Si oui, ce sera certainement une "classe statique"

Pour ce qui est de la méthode statique, c'est déjà plus compliqué. Soit la méthode est dans une classe plutot statique / classe "outil", et dans ce cas elle sera statique ; soit elle est dans une classe destinée à être un objet, et alors elle sera soit un outil, soit elle servira de support à cette classe.

Par exemple :

- La méthode statique du Singleton. Elle offre la fonctionnalité d'instancier la classe dans laquelle elle appartient.
- Un élément commun à toutes les instances de la classe et susceptible de changer même après plusieurs instanciations. Par exemple, la classe Zend_Db_Table (sauf erreur de ma part, mais c'est l'exemple qui compte) possède une propriété statique renfermant l'instance d'une Zend_Db, une instance que l'on souhaite utiliser par défaut. La méthode Zend_Db_Table::setDefault() par exemple, je dis ça au pif, permettra de définir cette instance par défaut. Ainsi, si tu utilise une table et que tu insères des données, il ira chercher l'instance enregistrée à moins que tu ne lui en fournisses une en particulier. Toutes les instances possèdent donc la même donnée, en statique.

Eléphant du PHP | 209 Messages

08 juil. 2011, 17:56

Bon, alors, avant de parler des méthodes statiques, il faut parler des attributs statiques.

Un attribut non statique fait partie d'un objet, il est étanche vis à vis des autres objets.
class Voiture {
	public $vitesse;
}

$v1 = new Voiture();
$v1->vitesse = 120;

$v2 = new Voiture();
$v2->vitesse = 60; // pas le même espace mémoire que $v1->vitesse !

Un attribut statique, quant à lui, fais partie des élements de la classe, c'est à dire que tout les objet partage sa connaissance et peuvent le modifier.
Il agit donc comme une variable globale pour tous les objets d'une classe :
class Voiture {

	private static $nbVoiture;
	
	public function __construct(){
		self::$nbVoiture ++ ;	
	}

}
L'attribut statique est commun à tout les objets "voiture", c'est ce qui permet des les compter.


Maintenant, comme tu as noté que $nbVoiture est private, comment puis-je obtenir le nombre de voiture ?

Si je fais :
	public function getNbVoiture(){
		return self::$nbVoiture;	
	}
Il y a un problème : je vais devoir instancier un objet voiture avant de pouvoir en connaitre le nombre, je ne pourrais donc jamais affiché 0 voiture.

La fonction getNbVoiture() est donc nécessairement statique :
	public static function getNbVoiture(){
		return self::$nbVoiture;	
	}
Une fonction ne peut être statique que si elle utilise des élements (attributs ou méthodes) statiques de la classe.

Je vais encore me faire des ennemies, mais les fonctions statiques je trouve ca très bof ...
Notamment pour les classes "utilitaires" : cela sert dans les langage full objet comme java car on ne peux pas faire autrement, mais en PHP, on peux simplement écrire des fonctions et oublier un peu la POO. On peux également faire des objets utilitaires à instancier normalement, il n'y a pas de mal à ca.
--
Eric

devlop78
Invité n'ayant pas de compte PHPfrance

08 juil. 2011, 20:41

Le dernier point est un point de vue ... Perso, je suis sur une vision "full objet" et c'est d'ailleurs ce qui m'a poussé à utiliser Zend plutot que Symfony ... Dans ce dernier, il y a par exemple, de mémoire, la fonction url() ou escape() je ne sais plus, alors que en Zend, c'est $this->url() ($this étant la vue dans un script de vue). C'est aussi pour ça que j'adorerais avoir une sorte de prototypage du style $var->toLower(), ou un regroupement de type String::toLower() et ne laisser que les mots clés sans classe (pour le coup, c'est normal ... comme return, new, etc ...).

C'est vraiment une question de point de vue, et c'est un choix à faire. Là où le choix est vraiment important, c'est lorsqu'il impacte vraiment les performances, la maintenabilité, etc.

A titre d'exemple, le seul endroit où je ne suis pas dans une classe est la zone d'initiation (index.php), où j'instancie par exemple le Loader et je démarre l'application. Après, tout est dans des méthodes.