插件类继承。无法更改变量

时间:2013-07-12 作者:olly

我想我在理解继承方面有问题<我有四节课是这样的;

class FOO extends WP_Widget {
    protected $pluginOptions;
    function __construct() {
        $this->pluginOptions = get_option(\'option_name\',0); 
        /*$this->pluginOptions[\'email\'] returns /is set to [email protected] 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\']=\'[email protected]\';
    }
}
$BAR=new BAR();
我在另一个文件中调用:

$sendEmail=new FOO_SEND_EMAIL;
我想-就像BAR 之前被调用FOO_SEND_EMAIL
$this->pluginOptions[\'email\'] 现在是[email protected].

但是,在执行以下操作时$sendEmail 仍设置为[email protected]. 有没有人能给我指出一个正确的方向,也许是我错在哪里?(如有必要,当然很乐意提供更多代码)。

3 个回复
最合适的回答,由SO网友:Mike Madern 整理而成

如果你打电话BAR 电子邮件地址设置为[email protected]. 但是当你打电话的时候FOO_SEND_EMAIL, 电子邮件地址设置为[email protected] 因为它被FOO\'s构造函数。

你跑吧$sendEmail = new FOO_SEND_EMAIL, 执行此操作时FOO 被调用。这跟什么都没有关系$BAR 目前是。

SO网友:Krzysiek Dróżdż

$pluginOptions 是对象属性。它不是静态属性,所以可以为此类(对象)的一个实例设置它的值,而不是为所有实例设置它的值。每个对象对此属性/成员都有自己的值。

您应该使用static property 做你想做的,我想。

SO网友:m4ndi

九个月后,同样的船。Wordpress…嗯。。。

在小部件中。php中,有一个名为WP\\u Widget\\u Factory的类(第319行),在它的构造函数中,它将\\u register\\u Widget附加到widgets\\u init hook。这个回调函数非常明智,然后决定遍历已注册的widget数组和任何已注册的widget,它会删除(第341行),以便可以重新注册它们,直接调用构造函数\\uu构造(第345324行)。

此外,这些都无关紧要,因为您的父构造函数无论如何都不会在BAR的构造函数z中被调用。在php中,如果定义了\\uu construct(),则必须显式调用父项::\\uu construct();以运行父构造函数。

但是,如果不定义\\uu construct(),则默认情况下将运行父构造函数。

继承的基本规则。

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();
        }
    }
}

结束

相关推荐

Looping taxonomy in taxonomy?

所以我有一个CPT的参考文献(就像一个音乐的字典格式)。其中有两种分类法:medium_reference 和reference_letter.这个reference_letter 列出字母A-Z,而medium_reference 按引用类型(人员、术语、公司)列出。我想知道是否有可能遍历每个字母,然后在该循环中遍历各个术语。类似这样的情况(无论如何都不可能):$reference_letters = get_the_terms($post->ID,\'reference_letter\');&#