У меня есть вспомогательный класс с некоторыми статическими функциями. Все функции класса требуют, чтобы «тяжелая» функция инициализации запускалась один раз (как если бы это был конструктор).
Есть ли хорошая практика для достижения этого?
Единственное, о чем я думал, это вызов функции init
и нарушение ее потока, если он уже запускался один раз (используя статический $initialized
var 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();
// file Foo.php class Foo { static function init() { /* ... */ } } Foo::init();
Таким образом, инициализация происходит, когда файл класса включен. Вы можете убедиться, что это происходит только при необходимости (и только один раз), используя автозагрузку.
Фактически, я использую публичный статический метод __init__()
для своих статических классов, для которых требуется инициализация (или, по крайней мере, нужно выполнить какой-то код). Затем, в моем автозагрузчике, когда он загружает класс, он проверяет is_callable($class, '__init__')
. Если это так, он вызывает этот метод. Быстро, просто и эффективно …
Примечание. RFC, предлагающий это, все еще находится в проекте состояния.
class Singleton { private static function __static() { //... } //... }
предлагается для PHP 7.x (см. https://wiki.php.net/rfc/static_class_constructor )