Aller au contenu

Class::maFonction() ou $Class->maFonction()


MS-DOS_1991

Sujets conseillés

Bonjour :)

Je voudrais savoir lequel des deux codes suivants est le plus rapide et pourquoi :

<?php
include('maclasse.class.php');

// Appel de méthode avec l'opérateur de résolution '::'
echo MaClasse::maFonction();
// Appel de méthode avec l'opérateur '->' une fois la classe instanciée
$MaClasse = new MaClasse;
echo $MaClasse->maFonction();
?>

Bien entendu, avec de nombreux appels à des méthodes de cette classe (sinon il est évident -quoique- que l'instanciation prendra plus de temps qu'un simple appel avec opérateur de résolution ^^ )

Merci de votre aide :smartass:

P.S: J'ai essayé de faire un benchmark (boucle de 10 000 puis 100 000 itérations) mais les résultats n'étaient pas constants :wacko:

Lien vers le commentaire
Partager sur d’autres sites

Bonjour MS-DOS_1991,

ta question me paraît un peu inutile, puisque tu cherches à comparer deux choses qui ne le sont pas...

En ce qui concerne l'appel de "MaClasse::maFonction();", il s'agit d'une méthode statique, ce qui veux dire que ta classe "MaClasse" n'est pas instanciée pour appeler cette méthode (pas d'appel du constructeur, objet inexistant en mémoire...Etc

Dans le cas de l'autre appel, tu appeles la méthode sur un objet qui est une instance de la classe, ce qui signifie que ton objet à été construit et existe en mémoire, et c'est sur lui que tu vas appeler la méthode...

Pour répondre en absolu à ta question, à priori je pense que la méthode statique doit d'avérer la plus rapide puisqu'elle ne nécessite pas de construction d'objet, mais encore une fois, l'utilisation de ces deux "techniques" se fait dans des cas différents...

Lien vers le commentaire
Partager sur d’autres sites

Tout d'abord, merci de ta réponse :)

Pour répondre en absolu à ta question, à priori je pense que la méthode statique doit d'avérer la plus rapide puisqu'elle ne nécessite pas de construction d'objet, mais encore une fois, l'utilisation de ces deux "techniques" se fait dans des cas différents...

Pourrais-tu préciser ? :unsure:

Il est évident que la méthode statique ne peut être utilisée lorsque la méthode de classe fait appel à un objet instancié dans la classe (ex: une classe de gestion de BDD), mais dans le cas où on extrait (par exemple) des informations d'un fichier, c'est-à dire si l'on a pas besoin d'utiliser des variables spécifiques à la classe et où on renvoie le résultat directement, pourquoi ne pas préférer cette méthode ?

Par exemple, je me souviens d'avoir observé ce genre d'appels dans le code de DotClear (versions antérieures à la 2.0)... Cette forme de codage présenterait-elle un intérêt particulier ?

Lien vers le commentaire
Partager sur d’autres sites

Pourrais-tu préciser ?

Lorsque l'on implémente une classe, il y a deux possibilitées...

Ou bien cette classe te fournit des utilitaires (de conversion par exemple, d'affichage de date, d'heure...etc), et dans ce cas tu n'as pas besoin de l'instancier, et donc tu fais appel à des méthodes statiques.

Ou bien cette classe représente un objet au sein de ton application (un utilisateur..Etc) et dans ce cas, tu l'instancie, et ensuite tu appeles les méthodes voulues...

Le trouve ça pas vraiment clair de mélanger des méthodes statiques et non statiques dans une même classe (sauf usages particuliers, comme le Design Pattern Singleton par exemple...). Comme je te l'ai dit, "l'avantage" peut venir du fait que tu n'as pas à instancier d'objet pour appeler la méthode, d'où un leger gain de temps et de mémoire...

Maintenant ta remarque est très juste quand tu lis un fichier et que tu renvoies directement le résultat, tu peux passer par des méthodes statiques, mais dans ce cas, je pense que le plus clair niveau code est de faire une classe qui gère la lecture des fichiers et le renvoit de valeurs et qui ne possède que des méthdoes statiques... mais c'est surtout un choix de programmation....

Lien vers le commentaire
Partager sur d’autres sites

Pour finir, si une fonction ne dépend pas de paramètres de la classe où elle est appelée, et qu'elle est amenée à être appelée hors du contexte de cette classe, pourquoi ne pas la définir hors de la classe ?

Dans un modèle orienté objet, cela permet de savoir exactement que fait celle fonction en cas de nom semblable avec une autre qui elle ferait quelque chose d'opposé ;)

Exemple: pour un forum (le mien en l'ocurrence)

$Forum = new Forum($id_du_forum_courant);
$Forum->markRead(); // marque le forum courant comme lu par le visiteur
// --------
$Topic = new Topic($id_du_sujet_courant);
$Topic->markRead(); // marque le sujet courant comme lu par le visiteur

Bien sûr, on pourrait m'objecter que j'aurais pu faire une fonction markRead($what, $id_du_truc) avec un switch pour déterminer ce qu'il faut marquer comme lu... Personellement, je préfère mettre ça dans des classes séparées, ce qui permet de fournir le moins de paramètres possible et permet surtout une plus grande clarté du code ;) C'est donc avant tout un choix de programmation...

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...