Как получить экземпляр одноэлементного PHP-класса при его расширении?

#php #design-patterns #frameworks #singleton

#php #шаблоны проектирования #фреймворки #singleton

Вопрос:

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

Например;

 index.php
---------
require_once "Libs/Damn.php";
$damn = Damn::getInstance();

// Initialize the URI class for handling user's request.
$damn->load('URI');
$damn->load('Modules');
$damn->load('Views');

if($damn->URI->module){
    $damn->Modules->load($damn->URI->module);
} else {
    $damn->Modules->load('main');
}
  

Это просто загрузка библиотеки 3 и поиск имени модуля в URL. Если он не может найти, он загрузит модуль с именем «main» (main.php ).

Вот в чем проблема;

Когда я расширяю этот чертов класс в main.php я не могу получить доступ к загруженным библиотекам, таким как URI, Modules, но я хочу. Кажется, что расширение одноэлементного класса не означает получение экземпляра класса, просто копирование его.

Я хочу иметь возможность использовать модульный класс, подобный этому;

 main.php
--------
<?php
if (!defined('SECURED')) die('Access denied.');

class Main extends Damn {

    public function __construct() {}

    public function index() {
        $this->Views->load('test'); //Views library already loaded when Damn initiated.
    }

    public function __destruct() {}

}

?>
  

Ответ №1:

Вы на самом деле не расширяете Damn. Вы создаете новый класс, который расширяется от Damn. Ваш исходный класс не затронут, и данные в одноэлементном экземпляре волшебным образом не копируются в новый класс.

Лучшим (ну, «хорошим») решением здесь является не расширение Main из Damn, а создание нового класса Main, который использует Damn для управления моделями.

Нелогично изменять тип экземпляра синглтона на основе свойства более раннего экземпляра синглтона. Это пахнет плохим дизайном 🙂