За последние 24 часа нас посетили 69175 программистов и 5402 робота. Сейчас ищет 1371 программист ...

Синглтон при наследовании extends

Тема в разделе "PHP для новичков", создана пользователем frilevich, 12 мар 2023.

  1. frilevich

    frilevich Новичок

    С нами с:
    12 мар 2023
    Сообщения:
    1
    Симпатии:
    0
    Опишу пример.
    Делаем класс "Бог", у него есть __construct с вызовом методов получения данных:
    PHP:
    1. class God {
    2.    public $data;
    3.    public function __construct() {
    4.       $this->data = $this->getData();
    5.    }
    6.    private function getData() {
    7.       // вызов методов получения данных
    8.    }
    9. }

    Дальше от этого класса создаётся куча других классов, назовём их "Ничтожный", которые расширяют его. К примеру:
    PHP:
    1. class Zeus extends God {
    2.    public function __construct() {
    3.       parent::__construct();
    4.    }
    5. }

    И в некотором сценарии создаются объекты всех этих ничтожных детей. И получается так, что при каждом создании плюётся родительский божеский parent::__construct с повторным из раза в раз получением данных.
    PHP:
    1. //... некоторый php-сценарий
    2. $zeus = new Zeus();
    3. $apollo = new Apollo();
    4. $aphrodite = new Aphrodite();
    5. ...

    Возможно ли паттерн синглтона вкрутить в это дело, чтобы при очередном создании ничтожных детей не создавать очередное божеское создание родителя? Или я просто неправильно подошёл к этому делу?

    p.s. Пока описывал, задумался, а ведь каждый этот подкласс не создаёт никаких родительских богов, они сами являются богами и включают в себя все эти получения данных. Тогда нужно вынести все данные в какой-нибудь отдельный класс оруженосца, на котором будет синглтон и призывать его в очередном классе наследуемом от божеского. Но не знаю, достаточно ли это адекватно.
     
    #1 frilevich, 12 мар 2023
    Последнее редактирование: 12 мар 2023
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Ну не вызвать конструктор базового класса можно, но вы скорее всего нарушите работу. А вообще, синглтон не про наследование вообще. При наследовании всегда ВСЕ поля и методы базового класса будут и у класса наследника.

    Теоретически вы можете сделать $data статическим, и проверять перед вызовом, инициализировано ли оно. Ну это что прямо из вашего кода можно сказать, с ничтожными богами :)

    PHP:
    1. class God {
    2.    static public $data = null;
    3.    public function __construct() {
    4.       if (!self::$data) {
    5.           self::$data = $this->getData();
    6.       }
    7.    }
    8.    // ...
    9. }
    Теперь на всю божественную семейку будет один экземпляр $data.
    --- Добавлено ---
    Не самый лучший вариант, но надо понимать, чего вы сделать пытаетесь, чтоб предложить лучше
     
    frilevich нравится это.