Intereting Posts
Ссылка на файлы в JavaScript в плагине WordPress Перенаправить URL-адрес изображения на страницу через htaccess Можно ли установить плагин для удаления всего каталога тем? Удаление полей с страницы профиля темы My Login Plugin Как я могу прикреплять горячие ссылки в сообщениях / страницах на одном сервере? Обновлять внешние каналы только в cron? почему плагины загружаются до подключаемых модулей Это тяжелые плагины или множество плагинов, которые делают сайт медленным? Какой лучший плагин «вставить все изображения»? База данных для разработки Как я могу динамически обновлять класс в моем коротком коде? tiny_mce_before_init предотвращает появление значка пользовательского ярлыка Может ли плагин переопределять новый тип роли пользователя по умолчанию wp_nav_menu добавить некоторый элемент в контейнер Обновление пользовательской мета в пользовательской форме WordPress и перенаправление

наследование класса плагина. не может изменять переменную

Наверное, у меня проблема с пониманием наследования.
У меня есть 4 класса;

class FOO extends WP_Widget { protected $pluginOptions; function __construct() { $this->pluginOptions = get_option('option_name',0); /*$this->pluginOptions['email'] returns /is set to email@domain.com here*/ } } class FOO_ACTIONS extends FOO { function __construct() { parent::__construct(); /*some actions*/ } /*some methods*/ } class FOO_SEND_EMAIL extends FOO_ACTIONS { function __construct() { parent::__construct(); /*some actions*/ } /*some methods*/ } class BAR extends FOO{ function __construct() { /*change email here */ $this->pluginOptions['email']='anotheremail@anotherdomain.com'; } } $BAR=new BAR(); 

в другом файле, который я звоню:

 $sendEmail=new FOO_SEND_EMAIL; 

Я думал, что – когда BAR FOO_SEND_EMAIL до FOO_SEND_EMAIL
$this->pluginOptions['email'] теперь anotheremail@anotherdomain.com .

Однако при выполнении $sendEmail он по-прежнему настроен на email@domain.com . может ли кто-нибудь указать мне в правильном направлении, возможно, где я здесь не так? (с удовольствием предоставим больше кода, если необходимо).

Solutions Collecting From Web of "наследование класса плагина. не может изменять переменную"

Если вы вызываете BAR адрес электронной почты устанавливается на anotheremail@anotherdomain.com . Но когда вы вызываете FOO_SEND_EMAIL , адрес электронной почты устанавливается на email@domain.com потому что он перезаписывается конструктором FOO .

Вы запускаете $sendEmail = new FOO_SEND_EMAIL , когда вы это $sendEmail = new FOO_SEND_EMAIL , $sendEmail = new FOO_SEND_EMAIL конструктор FOO . Он не имеет ничего общего с любым $BAR настоящее время.

$pluginOptions – свойство объекта. Это не статическое свойство, поэтому вы устанавливаете его значение для одного экземпляра этого класса (объекта), а не для всех. Каждый объект имеет собственное значение этого свойства / члена.

Я думаю, вы должны использовать статическое свойство, чтобы делать то, что хотите.

то же судно, девять месяцев спустя. WordPress … hmph …

В widgets.php существует класс WP_Widget_Factory (строка 319), в его конструкторе он прикрепляет _register_widgets к виджетам widgets_init. Эта функция обратного вызова, во всей ее большой мудрости, затем решает перебирать массив зарегистрированных виджетов и всех, которые уже зарегистрированы, удаляет (строка 341), поэтому может перерегистрировать их, вызвав конструктор __construct, напрямую (строка 345, 324).

Кроме того, ничто из этого не имеет значения, поскольку ваш родительский конструктор никогда не вызывается в конструкторе BAR anywayz. В php, если вы определяете __construct (), вы должны EXPLICITLY вызвать parent :: __ construct (); для запуска родительского конструктора.

Однако, если вы НЕ определяете __constuct (), родительский конструктор будет работать по умолчанию.

Основные правила наследования, которые.

 class WP_Widget_Factory { var $widgets = array(); function WP_Widget_Factory() { add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); } function register($widget_class) { $this->widgets[$widget_class] = new $widget_class(); } function unregister($widget_class) { if ( isset($this->widgets[$widget_class]) ) unset($this->widgets[$widget_class]); } function _register_widgets() { global $wp_registered_widgets; $keys = array_keys($this->widgets); $registered = array_keys($wp_registered_widgets); $registered = array_map('_get_widget_id_base', $registered); foreach ( $keys as $key ) { // don't register new widget if old widget with the same id is already registered if ( in_array($this->widgets[$key]->id_base, $registered, true) ) { unset($this->widgets[$key]); continue; } $this->widgets[$key]->_register(); } } } не class WP_Widget_Factory { var $widgets = array(); function WP_Widget_Factory() { add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); } function register($widget_class) { $this->widgets[$widget_class] = new $widget_class(); } function unregister($widget_class) { if ( isset($this->widgets[$widget_class]) ) unset($this->widgets[$widget_class]); } function _register_widgets() { global $wp_registered_widgets; $keys = array_keys($this->widgets); $registered = array_keys($wp_registered_widgets); $registered = array_map('_get_widget_id_base', $registered); foreach ( $keys as $key ) { // don't register new widget if old widget with the same id is already registered if ( in_array($this->widgets[$key]->id_base, $registered, true) ) { unset($this->widgets[$key]); continue; } $this->widgets[$key]->_register(); } } } не class WP_Widget_Factory { var $widgets = array(); function WP_Widget_Factory() { add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); } function register($widget_class) { $this->widgets[$widget_class] = new $widget_class(); } function unregister($widget_class) { if ( isset($this->widgets[$widget_class]) ) unset($this->widgets[$widget_class]); } function _register_widgets() { global $wp_registered_widgets; $keys = array_keys($this->widgets); $registered = array_keys($wp_registered_widgets); $registered = array_map('_get_widget_id_base', $registered); foreach ( $keys as $key ) { // don't register new widget if old widget with the same id is already registered if ( in_array($this->widgets[$key]->id_base, $registered, true) ) { unset($this->widgets[$key]); continue; } $this->widgets[$key]->_register(); } } }