Intereting Posts
Насколько безопасно восстанавливать $ wp_query при выполнении разбиения на страницы WP_Query на странице Шаблон Удалить почтовые носители, кроме отмеченного изображения Есть ли способ стилизации статей один за другим? Условное значение для одного – {post-type} .php ссылка на библиотеку JS с использованием неработающих wp_enqueue_scripts Разделите слово из wp_list_categories Случайные символы в конце каждого URL-адреса изображения в сообщении Почему социальные значки исчезнут после добавления настраиваемого типа сообщений? Как использовать несколько шаблонов архива для таксономии? Стриптиз HTML-теги на пользовательский код из the_content Как изменить сетевой домен WordPress Как отправить запрос на получение файла file.php справа и где хранить этот файл.php? Javascript не работает в admin Виджет боковой панели Регистрация без имени, как она назначается новому виджету с боковой панелью? Как включить admin-ajax при загрузке внешнего javascript

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

Наверное, у меня проблема с пониманием наследования.
У меня есть 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(); } } }