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

Я предполагаю, что у меня есть проблема при понимании наследования.
У меня есть 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
$this->pluginOptions['email'] теперь anotheremail@anotherdomain.com.

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

0
12.07.2013, 13:03
3 ответа

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

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

1
20.02.2020, 00:10
  • 1
    хм, да я изобразил это. однако, я (имел бы) думал, что, поскольку ПАНЕЛЬ расширяет НЕЧТО, и FOO_SEND_EMAIL является ребенком НЕЧТО, FOO изменяется ПАНЕЛЬЮ, прежде чем FOO_SEND_EMAIL назовут (очевидно, не, но я не понимаю, почему не, или что еще более важно как изменить то поведение)... –  olly 12.07.2013, 12:37
  • 2
    BAR и FOO_SEND_MAIL два различных объекта, которые, оказывается, наследовались FOO. Если объектные изменения, которые это не изменяет для всех объектов, которые наследовались FOO потому что они - все отдельные объекты. Если Вы хотите изменить адрес электронной почты, необходимо сделать это в том же объекте. –  Mike Madern 12.07.2013, 12:51
  • 3
    хорошо затем. я признаю что как ответ/объяснение. я надеялся смочь к виду, склеивают их без дополнительных рычагов, но в конце концов кажется, что я не могу сделать этого. так или иначе, спасибо за внимание разъясняя вещи Спасибо TheDeadMagic –  olly 12.07.2013, 15:42

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

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

0
20.02.2020, 00:10
  • 1
    хм, я пытался изменить защищенный $pluginOptions на защищенный статический $pluginOptions, но это, кажется, не имеет значения... –  olly 12.07.2013, 12:20

та же лодка, девять месяцев спустя. Wordpress … hmph...

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

Кроме того, ни одно из этого не имеет значения, поскольку Вашего родительского конструктора никогда не вызывают в конструкторе ПАНЕЛИ так или иначе. В php, если Вы определяете __ конструкция (), необходимо ЯВНО назвать родителя:: __ конструкция (); заставить родительского конструктора работать.

Однако, если Вы не определите __ 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();
        }
    }
}
0
20.02.2020, 00:10