2011-01-13 4 views
7

j'ai répondu récemment cette question:Outre les singletons, quelles sont les raisons impérieuses d'utiliser des méthodes statiques en PHP?

What are good reasons to use static methods in PHP?

La première chose à venir à l'esprit, bien sûr, était un singleton. À quelques exceptions près, les autres répondeurs ont fourni le même exemple singleton. Mais cela m'a fait réfléchir ... Je n'utilise jamais vraiment de méthodes ou de propriétés statiques pour autre chose que de créer des singletons!

Une brève recherche a permis d'obtenir de nombreux tutoriels sur l'utilisation de méthodes statiques, presque toutes implémentant une variante de la même classe singleton.

Je suis vraiment intéressé: Quelle raison avons-nous de faire des méthodes statiques autres que la création de singletons (ou autre que d'être juste paresseux et de vouloir une fonction globale)? Est-ce que quelqu'un a un exemple pragmatique d'utilisation d'une méthode statique qui ne pourrait pas être mieux accomplie en utilisant un modèle de conception dynamique? L'exemple peut être un singleton si cela a du sens dans son contexte, mais je m'intéresse à d'autres raisons en plus de l'aspect singleton de la solution.

Répondre

6

Un modèle d'usine utilisera normalement un appel statique ainsi; mais il est judicieux d'utiliser des méthodes statiques pour tout mathod de classe qui n'a aucune dépendance avec les propriétés de l'instance ou d'autres méthodes d'instance, en particulier quand elles sont appelées régulièrement, pour des raisons de performances. La place logique pour la méthode suivante dans PHPExcel est dans la classe PHPExcel_Cell, car elle concerne directement la manipulation d'une adresse de cellule (n'importe quelle adresse de cellule, pas seulement l'adresse d'une instance spécifique), mais elle ne dépend pas de la instance, donc je le déclare statique.

public static function stringFromColumnIndex($pColumnIndex = 0) { 
    if ($pColumnIndex < 26) { 
     return chr(65 + $pColumnIndex); 
    } elseif ($pColumnIndex < 702) { 
     return chr(64 + ($pColumnIndex/26)).chr(65 + $pColumnIndex % 26); 
    } 
    return chr(64 + (($pColumnIndex - 26)/676)).chr(65 + ((($pColumnIndex - 26) % 676)/26)).chr(65 + $pColumnIndex % 26); 
} 

Et cette méthode est particulièrement difficile à tester

+0

Et comment je me moque exactement de l'appel de la fonction statique lorsque je teste un autre objet qui l'utilise? –

+0

Oh! J'avais oublié qu'il n'y avait qu'une seule vraie méthodologie de test –

+0

@Mark James soulève une question valide. Et je dirais que c'est intéressant pour quiconque veut utiliser PHPExcel dans ses propres projets de savoir ce que les créateurs suggèrent de tester. – Gordon

3

Il ne s'agit pas nécessairement de motifs. PHP n'est pas un environnement persistant, donc la durée de vie d'une instance d'objet est susceptible d'être en millisecondes, mais elle nécessite une allocation/libération de mémoire et des cycles de CPU supplémentaires. À moins que vous ayez besoin d'objets ou de collections réutilisables, je trouve que les objets non statiques ont peu de justification.

+0

aimerait voir vos tests unitaires – Gordon

+0

Désolé, vous ne pouvez pas, parce que je ne l'utilise pas. Pourtant, aucun de plus de 50 systèmes clients installés au cours des deux dernières années ne rencontre de problèmes :) –

+2

n'êtes-vous pas le super-codeur! – Stephen

2
+0

+1 et la même chose est vraie pour [Singletons] (http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323). Évitez les deux ensemble. – Gordon

+0

Singletonitis - la peste de dessins OOP iffy –

+0

+1 belle série de liens! Bonne lecture. – Stephen

Questions connexes