У меня есть класс помощника с некоторыми статическими функциями. Все функции в классе требуют, чтобы 'тяжелая' функция инициализации работала однажды (как будто это был конструктор).
Существует ли хорошая практика для достижения этого?
Единственная вещь, о которой я думал, звонила init
функция и повреждение ее потока, если это уже работало однажды (использование помех $initialized
var). Проблема состоит в том, что я должен назвать его на каждых из функций класса.
Похоже, вам лучше использовать синглтон, а не кучу статических методов
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();
На самом деле, я использую общедоступный статический метод __ init __ ()
в своих статических классах, которые требуют инициализации (или, по крайней мере, должны выполнить некоторый код). Затем в моем автозагрузчике, когда он загружает класс, он проверяет is_callable ($ class, '__init __')
. Если это так, он вызывает этот метод. Быстро, просто и эффективно ...
// file Foo.php
class Foo
{
static function init() { /* ... */ }
}
Foo::init();
Таким образом, инициализация происходит при включении файла класса. Вы можете убедиться, что это происходит только при необходимости (и только один раз), используя автозагрузку.