Page 1 sur 1

appel de méthode avec ou sans instance (opérateur de portée)

Posté : 18 août 2006, 22:38
par pyd001
Bonsoir à tous.
Je me plonge - vraiment - enfin - dans l'objet avec php5 et le ZendFramework.
Depuis une méthode de classe, j'appelle une méthode d'une autre classe.
Et je m'aperçoit que j'ai le choix entre instancier :

Code : Tout sélectionner

$objClass2 = new class2; $result = $objClass2->methodClass2();
et utiliser l'opérateur de portée :: (ORP)

Code : Tout sélectionner

$result = class2::methodClass2();
Je dis "j'ai le choix" car même si j'ai lu que l'ORP était d'abord prévu pour un appel de méthode dans une classe parent et "à éviter de préférence" pour ce que je veux faire....-inspiration profonde-...cette pratique est courante dans les classes du ZendFramework et de PEAR.
En plus:
- sans instance le constructeur n'est pas appelé! Et ce que j'y ai mis alors?
- comme je continue mes lectures en postant je vois qu'on peut appeler le constructeur (avec l'ORP, sans instance!!) cool ... mais il faudra implémenter un destructeur...
Je crois que je pourrai continuer longtemps comme ça. Alors je vais continuer dans l'instanciation, par défaut, en attendant que quelqu'un qui s'est dèjà posé ce genre de question - je ne suis évidemment pas le premier - passe par ici et ait le temps et l'envie de me répondre.
Merci d'avance.
nb: je ne demande pas un cours sur l'objet, mais un simple avis empirique, voire un lien qui traite de la question.

Posté : 19 août 2006, 11:01
par naholyr
As-tu une culture objet au départ ? Si oui laquelle ?

Je n'avais jamais vu ce terme "ORP", j'ai plutôt l'habitude de parler de membre statique tout simplement ;)

Vois l'ORP comme l'implémentation des spacenames tout simplement. C'est comme ça qu'on l'utilise en PHP, face justement à l'absence des spacenames. Cela te simplifiera les choses dans un premier temps avant d'aller plus loin.

Posté : 19 août 2006, 16:00
par icebreak
Si t'appelle, perso vaut mieux instancier. Mais ça dépends de tes besoins.
L'appel statique c'est si ta besoin d'un code spécifique, et non de l'objet.

Sinon tu construit ton architecture, un brin différente, et tu implémentes une Usine à objet (Factory, design patterns.)

Posté : 19 août 2006, 18:59
par Invité
D'abord, non je n'ai pas de culture objet. C'est d'ailleurs ce qui limite mes choix en matière de conception. Mais ça avance. Par exemple aves les membres statiques - merci pour la piste. Au passage, "spacenames" c'est pas la joie sur google fr - c'est mieux au singulier mais ça ne m'épargnera pas le traducteur en ligne pendant mes recherches.

Ensuite, la question n'était donc pas comment faire mon appel mais pourquoi choisir l'une ou l'autre possibilité.
Je vais donc rester sur l'instanciation, comme tu le suggères. Je n'ai pas besoin de cet objet mais ça pourrait être utile par la suite alors...
Merci aussi pour les design patterns, je ne savais même pas que le motif MVC que j'essaie de mettre en place avec le ZendFramework en fait partie.

Enfin, pour conclure rien de tel qu'une citation - tirée du JDNet à propos des design patterns :
De nombreux motifs ne "parleront" aux développeurs que s'ils ont déjà rencontré la situation précise du motif.
Objet, design patterns, même combat. Je vais donc me replonger dans le "motif" pour mieux "objectiser" mon code.
Encore merci.

Posté : 21 août 2006, 22:28
par rami
Namespace est plus utilisé que spacenames (?). Comme sa traduction litérale le signifie (espace de nom), les namespaces permettent d'éviter l'écrasement de nom de classes identiques par exemple. Si tu connais un peu Java, les packages permettent cela.

Généralement, les méthodes (et attributs) publiques et statiques permettent d'utiliser des "fonctions" (ou constantes dans le cas des attributs) équivalentes à des fonctions globales (ou variables globales). Ce n'est pas toujours conseillé car les variables globales, c'est souvent signe d'une conception moyenne.

Mais les méthodes statiques sont souvent utilisées pour faire des boîtes à outils. Par exemple, la classe Date pourrait avoir des méthodes pour faire des conversions entre différents formats. C'est le cas dans le framework Zend pour la classe ancêtre du framework (Zend) qui offre des méthodes pour charger une classe ou une interface, ou encore la classe Zend_Filter qui permet de filtrer des variables.

Par expérience, si tu hésites lors du développement, entre faire une classe qui doit être instanciée et une classe offrant des méthodes statiques, mieux vaut obter pour une classe à instancier.

Posté : 22 août 2006, 00:07
par naholyr
Namespace est plus utilisé que spacenames (?)
Je n'avais pas compris la réponse concernant spacename :lol: en effet j'avais mélangé mes pinceaux, les spacenames n'existent que dans ma dyslexie latente.
Par expérience, si tu hésites lors du développement, entre faire une classe qui doit être instanciée et une classe offrant des méthodes statiques, mieux vaut obter pour une classe à instancier.
Je dirais que si on se pose la question, c'est qu'on n'a pas terminé de modéliser le projet ;)