簡體   English   中英

從沒有父類的子類中調用父類屬性:____ struct

[英]Call parent property from child class without parent::__construct

我有一個帶有公共屬性$options的父類My_Admin

我有一個子類My_Notices ,需要訪問$options屬性。

如果在子類中將parent::__construct()放入子類的__construct() ,則我可以訪問$options 它會復制父類的整個輸出。 換句話說,由於子類調用parent::_construct()的實例化,我在同一頁面上獲得了兩個html頁面輸出。

我試過在子結構中聲明$options ,例如public function __construct($options)但隨后它告訴我:

Warning: Missing argument 1 for My_Notices::__construct()

**編輯**

以下是這些課程的細分:

class My_Admin
{
    private $sections;
    protected $settings;
    protected $defaults;
    public $options;
    public function __construct()
    {
        $this->settings = array();
        $this->get_settings();
        $this->defaults = array( /* stuff here */ );
        $this->sections = array( /* stuff here */ );
        add_filter('plugin_action_links', array($this, 'pluginpage'), 10, 2);
        add_action('admin_menu', array($this, 'menu'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue'));
        add_action('admin_init', array($this, 'deregister'), 20);
        add_action('wp_ajax_my_save', array($this, 'save'));
        if(!get_option('my_options')) $this->initialize();
        $this->options = get_option('my_options');
    }
}
class My_Notices extends My_Admin
{
    public function __construct()
    {
        add_action('admin_notices', array($this, 'baseconfig'));
        add_action('admin_init', array($this, 'baseignore'));
    }
    public function baseconfig(){
        global $pagenow;
        $uid = get_current_user_id();
        /* I NEED TO ACCESS $options HERE */
        if(!$this->options['base1'] || !$this->options['bs1name'])
        {
            if(!get_user_meta($uid, 'my_notice'))
            {   
            }
        }
    }
}

何時,根據您的意見,您需要致電父母的無印刷品。 您需要使用ob_startob_end_clean ,但是您應該查看您的邏輯是否正確,因為父級的類打印文本不是最好的。

class My_Notices extends My_Admin {
      public __construct(){
          ob_start(); // prevents prints.
          parent::__construct();
          ob_end_clean(); // clear the capture

          // Your code here....

更新 :您還可以檢查它是否是父項,然后打印:

class My_Admin
{
    private $sections;
    protected $settings;
    protected $defaults;
    public $options;
    public function __construct()
    {
        $this->settings = array();
        $this->get_settings();
        $this->defaults = array( /* stuff here */ );
        $this->sections = array( /* stuff here */ );

        if( !is_subclass_of($this, 'My_Admin' ) ) { // Is the parent
            add_filter('plugin_action_links', array($this, 'pluginpage'), 10, 2);
            add_action('admin_menu', array($this, 'menu'));
            add_action('admin_enqueue_scripts', array($this, 'enqueue'));
            add_action('admin_init', array($this, 'deregister'), 20);
            add_action('wp_ajax_my_save', array($this, 'save'));
       }

        if(!get_option('my_options')) $this->initialize();
        $this->options = get_option('my_options');
    }
    public function get_settings(){}
    public function initialize(){}
}
class My_Notices extends My_Admin
{
    public function __construct()
    {
        parent::__construct();
        add_action('admin_notices', array($this, 'baseconfig'));
        add_action('admin_init', array($this, 'baseignore'));

    }
}

查看工作原理: http : //sandbox.onlinephpfunctions.com/code/e4ed5143244aaf0c57b29ff8487d911ab7cf99dd

為了避免重復創建,這可能是您必須采取的方法:

將它們添加到您的My_Admin類中:

使自己成為一個private static $self; 屬性。

在您的__construct()方法中添加self::$self = &$this;

制作方法:

public static getInstance(){
    return $self;
}

在My_Notices中,將其添加到需要訪問options屬性的位置:

$my_admin = My_Admin::getInstance();
$my_admin->options;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM