ПРИМЕЧАНИЕ: Это именно то, что OP сказал, что они сделали. (Но не показал код для.) Я показываю здесь детали, чтобы вы могли сравнить их с принятым ответом. Я хочу сказать, что оригинальный инстинкт OP был, ИМХО, лучше, чем ответ, который он принял.
Учитывая, насколько высоко оценен принятый ответ, я хотел бы отметить, что "наивный" ответ на одноразовую инициализацию статических методов едва ли больше кода, чем та реализация Singleton - и имеет существенное преимущество .
final class MyClass {
public static function someMethod1() {
MyClass::init();
// whatever
}
public static function someMethod1() {
MyClass::init();
// whatever
}
private static $didInit = false;
private static function init() {
if (!$didInit) {
$didInit = true;
// one-time init code.
}
}
// private, so can't create an instance.
private function __construct() {
// Nothing to do - there are no instances.
}
}
Преимущество этого подхода, , заключается в том, что вы можете вызывать с простым синтаксисом статической функции:
MyClass::someMethod1();
Сравните это с вызовами, требуемыми для принятого ответа:
MyClass::getInstance->someMethod1();
Как правило, лучше всего платить кодирование один раз, когда вы кодируете класс, чтобы сделать звонящих проще.
Из всех ответов (включая этот) я предпочитаю ответ Виктора Николь . Просто. Никакого дополнительного кодирования не требуется. Нет "продвинутого" кодирования, чтобы понять. (Я рекомендую включить комментарий FrancescoMM, чтобы "init" никогда не выполнялся дважды.)
Так что я не потрудился написать этот ответ. Но так много людей проголосовали за принятый ответ, что я заключаю, что некоторые люди просто не знают об очевидном, «наивном» подходе (который я показываю здесь). Поймите это как отправную точку.