Статический инициализатор класса в PHP

У меня есть класс помощника с некоторыми статическими функциями. Все функции в классе требуют, чтобы 'тяжелая' функция инициализации работала однажды (как будто это был конструктор).

Существует ли хорошая практика для достижения этого?

Единственная вещь, о которой я думал, звонила init функция и повреждение ее потока, если это уже работало однажды (использование помех $initialized var). Проблема состоит в том, что я должен назвать его на каждых из функций класса.

83
задан TRiG 23 May 2016 в 09:26
поделиться

3 ответа

Похоже, вам лучше использовать синглтон, а не кучу статических методов

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
  }
}

И затем, в использовании

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

// You'd do this
Singleton::getInstance()->someMethod1();
111
ответ дан 24 November 2019 в 08:41
поделиться

На самом деле, я использую общедоступный статический метод __ init __ () в своих статических классах, которые требуют инициализации (или, по крайней мере, должны выполнить некоторый код). Затем в моем автозагрузчике, когда он загружает класс, он проверяет is_callable ($ class, '__init __') . Если это так, он вызывает этот метод. Быстро, просто и эффективно ...

55
ответ дан 24 November 2019 в 08:41
поделиться
// file Foo.php
class Foo
{
  static function init() { /* ... */ }
}

Foo::init();

Таким образом, инициализация происходит при включении файла класса. Вы можете убедиться, что это происходит только при необходимости (и только один раз), используя автозагрузку.

93
ответ дан 24 November 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: