Intereting Posts
Процедура обновления: взаимодействие с пользовательским подтверждением Как ограничить глубину иерархических страниц (для пользовательских типов сообщений) Только для детей Максимальная защита без использования пароля / входа Есть ли способ проверить, что readme просматривается на другом языке перед отправкой перевода? Перенос WordPress из Windows Server 2008 R2 (IIS v7.5) в CentOS Как настроить отношения с помощью категорий в WordPress? Загрузите iframe при входе пользователя Как добавить отображаемое изображение в существующую почту через php? Как исправить проблему с предварительным просмотром пользовательских настроек? Использование функции WordPress selected () Категория Post Loop сначала показывает родительский, затем дочерний Перебирать короткие коды с помощью короткого кода Файлы SVG и wordpress Получите мою сессию сайта в WordPress? Расширение профиля пользователя

wp_loaded со статическим синглтоном

На моем сайте WordPress я создал Singleton внутри настраиваемого плагина, например:

 class VBWpdb { private $trace = array(); public static function get_instance() { static $instance = null; if(null === $instance) { $instance = new static(); } return $instance; } //... 

Итак, я использую VBWpdb::get_instance() во многих местах моего кода для заполнения массива $trace (первый var класса). Он работает с целью иметь след вдоль моего кода, и этот статический класс является единственным экземпляром во время выполнения плагина. Я тестировал с произвольными параметрами var_dump

Проблема в том, что … Я хочу напечатать эту трассу после загрузки моей страницы, и я это делаю:

 add_action('wp_loaded', 'vb_dump_wpdb_trace'); function vb_dump_wpdb_trace() { VBWpdb::get_instance()->dump(); } 

Кажется, что этот экземпляр не создается снова, но $trace имеет NULL .

Я пропустил что-то, связанное с проживанием объекта на слоях WordPress?

Solutions Collecting From Web of "wp_loaded со статическим синглтоном"

Вы просто делаете это неправильно. Проблема начинается с использования синглета, просто никогда этого не делайте.

У вас есть класс журналов, которые входят в некоторый внутренний буфер. Все регистраторы регистрируются в одном буфере, поэтому буфер ( trace в вашем случае) представляет собой статический массив в классе. Не более get_intance , просто get_intance новый журнал и журнал. Это дает вам дополнительную гибкость при наличии нескольких классов журналов, которые «выводят» в один и тот же буфер.

У нас остается вопрос, как проверить журнал, и это вы делаете со статическим методом.

Я уверен, что эта схема может быть улучшена людьми с более жестким ООП, чем я, использование singleton эквивалентно использованию namespace а код, написанный под пространством имен, легче читать и использовать, чем синглтон, просто вызвать функцию напрямую без необходимо сначала обработать проблемы с получением объекта, проще использовать функцию в крючке и т. д.

Ваша функция get_instance никогда не создаст экземпляр класса из-за этой строки:

 $instance = new static(); 

должен быть:

 $instance = new VBWpdb();