Создание обработчика объект, объекты загружает в массив в PHP


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

Каждого отдельного подсказка создается как объект, все эти подсказки должны поступать в организм с этими правилами:

  1. Я должен быть в состоянии провести время со всеми подсказками.

  2. Учитывая мой массив, я должен быть в состоянии организовать цикл по каждой и вызвать метод для вывода, что подсказка как простой HTML.

Вот как я создаю подсказку:

interface Tooltip_Interface {
    public function get_attribute( $attribute );
}

class Tooltip implements Tooltip_Interface {

    public $data;

    public $is_data_processed = false;


    public function __construct( array $data ) {
        $this->data = $data;
    }

    protected function process_data() {

        if( $this->is_data_processed ) {
            return;
        }

        $this->is_data_processed = true;

        $this->data = array_merge([
                'id'        => '',
                'title'     => '',
                'body'      => '',
                'meta'      => ''
        ], $this->data);

        $this->data['id'] = stripslashes($this->data['id']);
        $this->data['title'] = stripcslashes($this->data['title']);
        $this->data['body']  = stripslashes($this->data['body']);
        $this->data['meta']  = stripslashes($this->data['meta']);
    }

    public function get_attribute( $attribute ) {
        $this->process_data();
        return $this->data[$attribute];
    }
}

interface Tooltip_Style_Interface {
    public function get_markup();
}

class Style_1 implements Tooltip_Style_interface {

    public $tooltip;

    public function __construct( Tooltip_Interface $tooltip ){
        $this->tooltip = $tooltip;
    }

    public function get_markup() {
        return sprintf(
            '<div class="nice-tooltip" id=%s><div class="main-body"><h4>%s</h4>%s</div></div><!--%s-->',
            $this->tooltip->get_attribute('id'),
            $this->tooltip->get_attribute('title'),
            $this->tooltip->get_attribute('body'),
            $this->tooltip->get_attribute('meta')
        );
    }
}

Что, для того, чтобы выходной HTML-код, мне нужно позвонить get_markup метод:

echo (new Style_Video
    (
        new Tooltip_Video([
            'id' => 'instagram-help',
            'title' => 'Need help with Instagram?',
            'body' => 'See Our Instagram Help Support Articles.',
            'video'=> 'https://www.youtube.com/watch?v=_Jc-Xcw1nJI',
            'meta' => 'Last update: last year'
        ])
    )
)->get_markup();

Но это несколько жестко. Я решил превратить это в синглтон в связи с необходимостью иметь общий массив подсказок (общий ресурс) в руках:

class Tooltip_Register {

    protected $tooltips = [];

    private static $instance;

    private function __construct() {
    }

    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    final function register_tooltip( Tooltip_Style_Interface $tooltip ) {
        $this->tooltips[] = $tooltip;
    }
}

И затем иметь обработчик для вывода все подсказки:

final class Tooltip_Handler extends Tooltip_Register {

    public $is_render_finished = false;

    public function __construct() {
    }

    final public function render_tooltips() {
        if( $this->is_render_finished ) {
            return;
        }

        foreach( parent::get_instance()->tooltips as $tooltip ) {
            echo $tooltip->get_markup();
        }

        $this->is_render_finished = true;
    }
}

Которое сейчас позволяет мне добавить столько подсказок, как я хочу с этим куском кода:

Tooltip_Register::get_instance()->register_tooltip(
    ( new Style_1
        (
            new Tooltip([
                'id' => 'instagram-help',
                'title' => 'This widget is not working?',
                'body' => 'See Our Widgets Videos',
                'meta' => 'Last update: last year'
            ])
        )
    ) 

Мои проблемы, что я должен использовать синглтон, который не хорошо с dynamicism в силу своей природы.

Конкретно, как я могу переписать это так, что я:

  1. Есть хороший способ зарегистрировать подсказку, как и я с Tooltip_Register::get_instance()->register_tooltip().

  2. Есть "общие переменные", такие как Tooltip_Register$this->tooltips.



Комментарии