106 votes

Initialisateur de classe statique en PHP

J'ai un cours d'aide avec des fonctions statiques. Toutes les fonctions de la classe nécessitent une fonction d'initialisation ‘lourde' pour s'exécuter une seule fois (comme s'il s'agissait d'un constructeur).

Existe-t-il une bonne pratique pour y parvenir ?

La seule chose à laquelle j'ai pensé était d'appeler une fonction init, et de rompre son flux s'il a déjà fonctionné une fois (en utilisant un var statique $initialized). Le problème est que je dois l'appeler sur chacune des fonctions de la classe.

125voto

Peter Bailey Points 62125

On dirait que vous seriez mieux servi par un singleton plutôt que par un tas de méthodes statiques

class Singleton
{
  /**
   * 
   * @var Singleton
   */
  private static $instance;

  private function __construct()
  {
    // Your "heavy" initialization stuff here
  }

  public static function getInstance()
  {
    if ( is_null( self::$instance ) )
    {
      self::$instance = new self();
    }
    return self::$instance;
  }

  public function someMethod1()
  {
    // whatever
  }

  public function someMethod2()
  {
    // whatever
  }
}

Et puis, dans l'usage

// As opposed to this
Singleton::someMethod1();

// You'd do this
Singleton::getInstance()->someMethod1();

100voto

Victor Nicollet Points 16924
// file Foo.php
class Foo
{
  static function init() { /* ... */ }
}

Foo::init();

De cette façon, l'initialisation se produit lorsque le fichier de classe est inclus. Vous pouvez vous assurer que cela ne se produit que lorsque cela est nécessaire (et une seule fois) en utilisant le chargement automatique.

58voto

ircmaxell Points 74865

En fait, j'utilise une méthode statique publique __init__() sur mes classes statiques qui nécessitent une initialisation (ou du moins doivent exécuter du code). Ensuite, dans mon chargeur automatique, quand il charge une classe, il vérifie is_callable($class, '__init__'). Si c'est le cas, il appelle cette méthode. Rapide, simple et efficace...

6voto

brzuchal Points 428

Il y a un moyen d'appeler la méthode init() une fois et d'interdire son utilisation, vous pouvez transformer la fonction en initialisateur privé et l'ivoker après la déclaration de classe comme ceci :

class Example {
    private static function init() {
        // do whatever needed for class initialization
    }
}
(static function () {
    static::init();
})->bindTo(null, Example::class)();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X