web-dev-qa-db-fra.com

Quand devrais-je utiliser des méthodes statiques?

J'ai une classe qui contient 10 méthodes. Je dois toujours utiliser une de ces méthodes . Maintenant, je veux savoir quelle approche est la meilleure? 

class cls{
    public function func1(){}
    public function func2(){}
    .
    .
    public function func10(){}
}

$obj  = new cls;
$data = $obj->func3(); // it is random, it can be anything (func1, or func9 or ...)

OR

class cls{
    public static function func1(){}
    public static function func2(){}
    .
    .
    public static function func10(){}
}

cls::func3(); // it is random, it can be anything (func1, or func9 or ...)
25
stack

C'est un sujet intéressant. Je vais vous donner une réponse axée sur le design.

À mon avis, vous ne devriez jamais utiliser une classe/fonction statique dans une bonne architecture OOP.

Lorsque vous utilisez static, cela consiste à appeler une fonction sans instance de la classe. La raison principale est souvent de représenter une classe de service qui ne devrait pas être instanciée plusieurs fois.

Je vais vous donner 3 solutions (du pire au meilleur) pour y parvenir:

Statique

Une classe statique (avec uniquement des fonctions statiques) vous empêche d'utiliser de nombreuses fonctionnalités OOP telles que l'héritage, la mise en œuvre d'interface. Si vous pensez vraiment à ce qui est une fonction statique, il s’agit d’une fonction nommée en fonction du nom de sa classe. Vous avez déjà des espaces de noms en PHP, alors pourquoi ajouter une autre couche?

Un autre inconvénient majeur est que vous ne pouvez pas définir de dépendances claires avec votre classe statique et les classes qui l'utilisent, ce qui est une mauvaise chose pour la maintenabilité et l'évolutivité de votre application.

Singleton

Un singleton est un moyen de forcer une classe à n'avoir qu'une seule instance:

<?php

class Singleton {
    // Unique instance.
    private static $instance = null;

    // Private constructor prevent you from instancing the class with "new".
    private function __construct() {  
    }

    // Method to get the unique instance.
    public static function getInstance() {
        // Create the instance if it does not exist.
        if (!isset(self::$instance)) {
            self::$instance = new Singleton();  
        }

        // Return the unique instance.
        return self::$instance;
    }
}

C'est un meilleur moyen car vous pouvez utiliser l'héritage, les interfaces et votre méthode sera appelée sur un objet instancié. Cela signifie que vous pouvez définir des contrats et utiliser couplage faible avec les classes qui l'utilisent. Cependant, certaines personnes considèrent le singleton comme un anti-motif d'autant plus que si vous voulez avoir 2 instances ou plus de votre classe avec différentes propriétés d'entrée (comme l'exemple classique de la connexion à 2 bases de données différentes) un grand refactoring de tout votre code en utilisant le singleton.

Un service

Un service est une instance d'une classe standard. C'est un moyen de rationaliser votre code. Ce type d'architecture s'appelle SOA (architecture orientée services). Je vous donne un exemple:

Si vous souhaitez ajouter une méthode pour vendre un produit dans un magasin à un consommateur et que vous avez les classes Product, Store et Consumer. Où devriez-vous instancier cette méthode? Je peux vous garantir que si vous pensez que c'est plus logique dans l'une de ces trois classes aujourd'hui, cela pourrait être autre chose demain. Cela entraîne de nombreuses duplications et une difficulté à trouver où se trouve le code que vous recherchez. Au lieu de cela, vous pouvez utiliser une classe de service telle que SaleHandler par exemple, qui saura manipuler vos classes de données.

C'est une bonne idée d'utiliser un framework vous aidant à les injecter les uns aux autres ( injection de dépendance ) afin de les utiliser à leur plein potentiel. Dans la communauté PHP, vous avez un exemple intéressant d'implémentation de ceci dans Symfony2 par exemple.


Pour résumer:

  • Si vous n'avez pas de framework, les singletons sont certainement une option même si je préfère personnellement un fichier simple dans lequel je fais une injection de dépendance manuelle.

  • Si vous avez un framework, utilisez sa fonctionnalité d'injection de dépendance pour faire ce genre de chose.

  • Vous ne devriez pas utiliser la méthode statique (dans la POO). Si vous avez besoin d’une méthode statique dans l’une de vos classes, cela signifie que vous pouvez créer un nouveau service/singleton contenant cette méthode et l’injecter à l’instance des classes qui en ont besoin.

43
Gnucki

Il existe donc une différence fondamentale entre les méthodes static.

Pour utiliser des fonctions statiques, vous n'avez pas besoin d'initialiser la classe en tant qu'objet. Par exemple, Math.pow(), ici .pow() (en Java; l'explication est toujours valable) est une méthode statique.

La règle générale est de rendre les méthodes auxiliaires static.

Ainsi, par exemple, si vous avez une classe de mathématiques, vous ne voudriez pas remplir le collecteur de mémoire avec des classes qui aident simplement d'autres classes plus importantes.

Vous pouvez l'utiliser comme initialiseurs dynamiques, s'il vous plait! 

Supposons que vous avez une classe RSAEncryptionHelper, maintenant vous pouvez généralement l'initialiser sans aucun paramètre et cela générera un objet avec une taille de clé de (par exemple) 512 bits; mais vous avez aussi un constructeur objet surchargé qui récupère toutes les propriétés d'autres classes:

$a = new RSAEncryptionHelper::fromPrimeSet(...);
3
weirdpanda

La réponse dépend de ce que font ces méthodes. Si vous les utilisez pour modifier l'état de l'objet concerné, vous devez utiliser les appels de méthode d'instance. Si ce sont des fonctionnalités indépendantes, vous pouvez utiliser les versions statiques, mais je me demanderais alors pourquoi elles font partie d'une classe.

3
Scott M.

Dans une classe PHP, vous pouvez utiliser class/méthodes/attributs: Abstract, Static, Private, Public, etc. Le meilleur moyen consiste à savoir comment les mélanger au sein d'une classe. en fonction des besoins, je vais vous donner un exemple de base:

Dans la classe Person, vous avez les méthodes private et public, mais vous avez une méthode appelée "get_nationality", donc c'est une fonction dont vous avez besoin ailleurs, mais vous n'avez pas La classe Person est déjà installée. Cette méthode est donc placée sous la forme STATIC de cette manière, vous pouvez appeler la méthode "get_nationality" sans installer de classe Person. plus optimal et à son tour maintenant des ressources dans le processeur.

0
Lenin Zapata

Les fonctions statiques sont également très utiles mais Je crée habituellement des traits lorsque je dois créer des fonctions qui sont indépendamment liées à une classe. 

Je ne sais pas si cette approche est meilleure ou non, mais la plupart du temps, je l’ai trouvée utile. 

Il suffit de partager mon approche ici pour que je puisse en apprendre davantage sur ses avantages et ses inconvénients.

0
Afraz Ahmad